From aa550f9d388435d5f0d3d2c87a4e17723d4d4495 Mon Sep 17 00:00:00 2001 From: Aswin Ashar Abdullah Date: Tue, 23 Jul 2024 19:24:40 +0700 Subject: [PATCH] feat(SPG-612) Activity Log PoS --- src/app.module.ts | 2 + src/core/strings/constants/table.constants.ts | 1 + .../migrations/1721736523991-pos-log.ts | 15 +++++++ src/modules/configuration/couch/constants.ts | 7 ++- .../log/data/models/pos-log.model.ts | 28 ++++++++++++ .../log/data/services/pos-log.service.ts | 17 ++++++++ .../log/domain/entities/pos-log.entity.ts | 17 ++++++++ .../log/domain/handlers/pos-log.handler.ts | 43 +++++++++++++++++++ src/modules/configuration/log/log.module.ts | 7 ++- 9 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/database/migrations/1721736523991-pos-log.ts create mode 100644 src/modules/configuration/log/data/models/pos-log.model.ts create mode 100644 src/modules/configuration/log/data/services/pos-log.service.ts create mode 100644 src/modules/configuration/log/domain/entities/pos-log.entity.ts create mode 100644 src/modules/configuration/log/domain/handlers/pos-log.handler.ts diff --git a/src/app.module.ts b/src/app.module.ts index 08b50d9..652dec6 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -69,6 +69,7 @@ import { NewsModel } from './modules/web-information/news/data/models/news.model import { BannerModule } from './modules/web-information/banner/banner.module'; import { BannerModel } from './modules/web-information/banner/data/models/banner.model'; import { MailModule } from './modules/configuration/mail/mail.module'; +import { PosLogModel } from './modules/configuration/log/data/models/pos-log.model'; @Module({ imports: [ @@ -96,6 +97,7 @@ import { MailModule } from './modules/configuration/mail/mail.module'; LogModel, NewsModel, PaymentMethodModel, + PosLogModel, RefundModel, RefundItemModel, SalesPriceFormulaModel, diff --git a/src/core/strings/constants/table.constants.ts b/src/core/strings/constants/table.constants.ts index 8c14c7d..7950937 100644 --- a/src/core/strings/constants/table.constants.ts +++ b/src/core/strings/constants/table.constants.ts @@ -7,6 +7,7 @@ export enum TABLE_NAME { ITEM_RATE = 'item_rates', GATE = 'gates', LOG = 'logs', + LOG_POS = 'logs_pos', NEWS = 'news', PAYMENT_METHOD = 'payment_methods', PRICE_FORMULA = 'price_formulas', diff --git a/src/database/migrations/1721736523991-pos-log.ts b/src/database/migrations/1721736523991-pos-log.ts new file mode 100644 index 0000000..5f89518 --- /dev/null +++ b/src/database/migrations/1721736523991-pos-log.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class PosLog1721736523991 implements MigrationInterface { + name = 'PosLog1721736523991'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "logs_pos" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "type" character varying NOT NULL DEFAULT 'cash withdrawal', "pos_number" bigint, "total_balance" numeric, "created_at" bigint, "creator_name" character varying, "creator_id" character varying, CONSTRAINT "PK_60df825558a6b6881d7ad770d26" PRIMARY KEY ("id"))`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "logs_pos"`); + } +} diff --git a/src/modules/configuration/couch/constants.ts b/src/modules/configuration/couch/constants.ts index 031c3c4..8171752 100644 --- a/src/modules/configuration/couch/constants.ts +++ b/src/modules/configuration/couch/constants.ts @@ -1 +1,6 @@ -export const DatabaseListen = ['transaction', 'vip_code']; +export const DatabaseListen = [ + 'transaction', + 'vip_code', + 'pos_activity', + 'pos_cash_activity', +]; diff --git a/src/modules/configuration/log/data/models/pos-log.model.ts b/src/modules/configuration/log/data/models/pos-log.model.ts new file mode 100644 index 0000000..b161889 --- /dev/null +++ b/src/modules/configuration/log/data/models/pos-log.model.ts @@ -0,0 +1,28 @@ +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { Column, Entity } from 'typeorm'; +import { PosLogEntity, PosLogType } from '../../domain/entities/pos-log.entity'; +import { BaseCoreModel } from 'src/core/modules/data/model/base-core.model'; + +@Entity(TABLE_NAME.LOG_POS) +export class PosLogModel + extends BaseCoreModel + implements PosLogEntity +{ + @Column('varchar', { name: 'type', default: PosLogType.cash_witdrawal }) + type: PosLogType; + + @Column('bigint', { name: 'pos_number', nullable: true }) + pos_number: number; + + @Column('decimal', { name: 'total_balance', nullable: true }) + total_balance: number; + + @Column('bigint', { name: 'created_at', nullable: true }) + created_at: number; + + @Column('varchar', { name: 'creator_name', nullable: true }) + creator_name: string; + + @Column('varchar', { name: 'creator_id', nullable: true }) + creator_id: string; +} diff --git a/src/modules/configuration/log/data/services/pos-log.service.ts b/src/modules/configuration/log/data/services/pos-log.service.ts new file mode 100644 index 0000000..745b929 --- /dev/null +++ b/src/modules/configuration/log/data/services/pos-log.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDataService } from 'src/core/modules/data/service/base-data.service'; +import { PosLogEntity } from '../../domain/entities/pos-log.entity'; +import { PosLogModel } from '../models/pos-log.model'; +import { InjectRepository } from '@nestjs/typeorm'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { Repository } from 'typeorm'; + +@Injectable() +export class PosLogService extends BaseDataService { + constructor( + @InjectRepository(PosLogModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { + super(repo); + } +} diff --git a/src/modules/configuration/log/domain/entities/pos-log.entity.ts b/src/modules/configuration/log/domain/entities/pos-log.entity.ts new file mode 100644 index 0000000..f29f780 --- /dev/null +++ b/src/modules/configuration/log/domain/entities/pos-log.entity.ts @@ -0,0 +1,17 @@ +import { BaseCoreEntity } from 'src/core/modules/domain/entities/base-core.entity'; + +export interface PosLogEntity extends BaseCoreEntity { + type: PosLogType; + pos_number: number; + total_balance: number; + created_at: number; + creator_name: string; + creator_id: string; +} + +export enum PosLogType { + cash_witdrawal = 'cash withdrawal', + opening_cash = 'opening_cash', + login = 'login', + logout = 'logout', +} diff --git a/src/modules/configuration/log/domain/handlers/pos-log.handler.ts b/src/modules/configuration/log/domain/handlers/pos-log.handler.ts new file mode 100644 index 0000000..7b794ff --- /dev/null +++ b/src/modules/configuration/log/domain/handlers/pos-log.handler.ts @@ -0,0 +1,43 @@ +import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; +import { ChangeDocEvent } from 'src/modules/configuration/couch/domain/events/change-doc.event'; +import { PosLogService } from '../../data/services/pos-log.service'; +import { PosLogModel } from '../../data/models/pos-log.model'; +import { PosLogType } from '../entities/pos-log.entity'; + +@EventsHandler(ChangeDocEvent) +export class RecordPosLogHandler implements IEventHandler { + constructor(private dataService: PosLogService) {} + + async handle(event: ChangeDocEvent) { + try { + const database = event.data.database; + const data = event.data.data; + + if (!['pos_cash_activity', 'pos_activity'].includes(database)) return; + + const queryRunner = this.dataService + .getRepository() + .manager.connection.createQueryRunner(); + + const activity = new PosLogModel(); + + Object.assign(activity, { + id: data._id, + type: PosLogType[data.type], + total_balance: data.withdrawal_cash ?? data.opening_cash_balance, + pos_number: data.pos_number, + creator_id: data.pos_admin?.id, + creator_name: data.pos_admin?.name, + created_at: data.created_at, + }); + + await this.dataService.create( + queryRunner, + PosLogModel, + activity, + ); + } catch (error) { + console.log('error handling pos activity couch'); + } + } +} diff --git a/src/modules/configuration/log/log.module.ts b/src/modules/configuration/log/log.module.ts index 14c8eef..06002f9 100644 --- a/src/modules/configuration/log/log.module.ts +++ b/src/modules/configuration/log/log.module.ts @@ -9,12 +9,15 @@ import { RecordErrorLogHandler } from './domain/handlers/error-log.handler'; import { RecordLogHandler } from './domain/handlers/log.handler'; import { ErrorLogService } from './data/services/error-log.service'; import { LogService } from './data/services/log.service'; +import { PosLogModel } from './data/models/pos-log.model'; +import { PosLogService } from './data/services/pos-log.service'; +import { RecordPosLogHandler } from './domain/handlers/pos-log.handler'; @Module({ imports: [ ConfigModule.forRoot(), TypeOrmModule.forFeature( - [LogModel, ErrorLogModel], + [LogModel, ErrorLogModel, PosLogModel], CONNECTION_NAME.DEFAULT, ), CqrsModule, @@ -22,9 +25,11 @@ import { LogService } from './data/services/log.service'; controllers: [], providers: [ RecordLogHandler, + RecordPosLogHandler, RecordErrorLogHandler, LogService, + PosLogService, ErrorLogService, ], })