From 389c26e1b01e860daf67627bf9aadc5f7a0f62f9 Mon Sep 17 00:00:00 2001 From: Aswin Ashar Abdullah Date: Mon, 8 Jul 2024 15:39:42 +0700 Subject: [PATCH] feat(SPG-585) DB COUCH Booking --- .../configuration/couch/couch.module.ts | 19 ++++- .../couch/domain/managers/booking.handler.ts | 73 +++++++++++++++++++ .../managers/detail-transaction.manager.ts | 65 +---------------- .../helpers/mapping-transaction.helper.ts | 63 ++++++++++++++++ 4 files changed, 156 insertions(+), 64 deletions(-) create mode 100644 src/modules/configuration/couch/domain/managers/booking.handler.ts create mode 100644 src/modules/transaction/transaction/domain/usecases/managers/helpers/mapping-transaction.helper.ts diff --git a/src/modules/configuration/couch/couch.module.ts b/src/modules/configuration/couch/couch.module.ts index 5655e67..95617d9 100644 --- a/src/modules/configuration/couch/couch.module.ts +++ b/src/modules/configuration/couch/couch.module.ts @@ -29,15 +29,31 @@ import { ItemModel } from 'src/modules/item-related/item/data/models/item.model' import { UserModel } from 'src/modules/user-related/user/data/models/user.model'; import { UserDataService } from 'src/modules/user-related/user/data/services/user-data.service'; import { ItemDataService } from 'src/modules/item-related/item/data/services/item-data.service'; +import { BookingDeletedEvent, BookingHandler } from './domain/managers/booking.handler'; +import { TransactionDataService } from 'src/modules/transaction/transaction/data/services/transaction-data.service'; +import { TransactionModel } from 'src/modules/transaction/transaction/data/models/transaction.model'; +import { TransactionTaxModel } from 'src/modules/transaction/transaction/data/models/transaction-tax.model'; +import { TransactionItemModel } from 'src/modules/transaction/transaction/data/models/transaction-item.model'; @Module({ imports: [ ConfigModule.forRoot(), - TypeOrmModule.forFeature([ItemModel, UserModel], CONNECTION_NAME.DEFAULT), + TypeOrmModule.forFeature( + [ + ItemModel, + UserModel, + TransactionModel, + TransactionTaxModel, + TransactionItemModel, + ], + CONNECTION_NAME.DEFAULT, + ), CqrsModule, ], controllers: [CouchDataController], providers: [ + BookingHandler, + BookingDeletedEvent, PaymentMethodDeletedHandler, PaymentMethodUpdatedHandler, VipCategoryDeletedHandler, @@ -49,6 +65,7 @@ import { ItemDataService } from 'src/modules/item-related/item/data/services/ite UserDeletedHandler, UserUpdatedHandler, + TransactionDataService, UserDataService, ItemDataService, CouchService, diff --git a/src/modules/configuration/couch/domain/managers/booking.handler.ts b/src/modules/configuration/couch/domain/managers/booking.handler.ts new file mode 100644 index 0000000..4b64585 --- /dev/null +++ b/src/modules/configuration/couch/domain/managers/booking.handler.ts @@ -0,0 +1,73 @@ +import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; +import { TransactionDataService } from 'src/modules/transaction/transaction/data/services/transaction-data.service'; +import { TransactionChangeStatusEvent } from 'src/modules/transaction/transaction/domain/entities/event/transaction-change-status.event'; +import { CouchService } from '../../data/services/couch.service'; +import { STATUS } from 'src/core/strings/constants/base.constants'; +import { TransactionPaymentType } from 'src/modules/transaction/transaction/constants'; +import { mappingTransaction } from 'src/modules/transaction/transaction/domain/usecases/managers/helpers/mapping-transaction.helper'; +import { TransactionDeletedEvent } from 'src/modules/transaction/transaction/domain/entities/event/transaction-deleted.event'; +import { TransactionUpdatedEvent } from 'src/modules/transaction/transaction/domain/entities/event/transaction-updated.event'; + +@EventsHandler(TransactionDeletedEvent) +export class BookingDeletedEvent + implements IEventHandler +{ + constructor(private couchService: CouchService) {} + + async handle(event: TransactionDeletedEvent) { + await this.couchService.deleteDoc( + { + _id: event.data.id, + ...event.data.data, + }, + 'item', + ); + } +} + +@EventsHandler(TransactionChangeStatusEvent, TransactionUpdatedEvent) +export class BookingHandler + implements IEventHandler +{ + constructor( + private bookingService: TransactionDataService, + private couchService: CouchService, + ) {} + + async handle(event: TransactionChangeStatusEvent) { + const old_data = event.data.old; + const data = event.data.data; + + if (data.payment_type != TransactionPaymentType.COUNTER) return; + + const booking = await this.bookingService.getOneByOptions({ + where: { + id: data.id, + }, + relations: ['items'], + }); + + mappingTransaction(booking); + + if ( + old_data?.status != data.status && + [STATUS.PENDING, STATUS.ACTIVE].includes(data.status) + ) { + await this.couchService.createDoc( + { + _id: booking.id, + ...booking, + }, + 'booking', + ); + } else { + await this.couchService.updateDoc( + { + _id: booking.id, + ...booking, + }, + 'booking', + ); + } + } +} diff --git a/src/modules/transaction/transaction/domain/usecases/managers/detail-transaction.manager.ts b/src/modules/transaction/transaction/domain/usecases/managers/detail-transaction.manager.ts index 63cfe47..01e731b 100644 --- a/src/modules/transaction/transaction/domain/usecases/managers/detail-transaction.manager.ts +++ b/src/modules/transaction/transaction/domain/usecases/managers/detail-transaction.manager.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { BaseDetailManager } from 'src/core/modules/domain/usecase/managers/base-detail.manager'; import { TransactionEntity } from '../../entities/transaction.entity'; import { RelationParam } from 'src/core/modules/domain/entities/base-filter.entity'; +import { mappingTransaction } from './helpers/mapping-transaction.helper'; @Injectable() export class DetailTransactionManager extends BaseDetailManager { @@ -14,69 +15,7 @@ export class DetailTransactionManager extends BaseDetailManager { - let payment_type_bank; - - const season_period = { - id: this.result.season_period_id, - holiday_name: this.result.season_period_name, - season_type: { - id: this.result.season_period_type_id, - name: this.result.season_period_type_name, - }, - }; - - if (this.result.payment_type_method_id) { - payment_type_bank = { - id: this.result.payment_type_method_id, - issuer_name: this.result.payment_type_method_name, - account_number: this.result.payment_type_method_number, - }; - } - - const items = this.result?.['items']?.map((itemData) => { - let tenant; - - if (itemData.item_tenant_id) { - tenant = { - id: itemData.item_tenant_id, - name: itemData.item_tenant_name, - share_margin: itemData.item_tenant_share_margin, - }; - } - - return { - item: { - id: itemData.item_id, - name: itemData.item_name, - item_type: itemData.item_type, - base_price: itemData.item_price, - hpp: itemData.item_hpp, - tenant: tenant, - item_category: { - id: itemData.item_category_id, - name: itemData.item_category_name, - }, - }, - qty: itemData.qty, - total_price: itemData.total_price, - }; - }); - - Object.assign(this.result, { - season_period: season_period, - items: items, - payment_type_bank: payment_type_bank, - }); - - delete this.result.season_period_id; - delete this.result.season_period_name; - delete this.result.season_period_type_id; - delete this.result.season_period_type_name; - - delete this.result.payment_type_method_id; - delete this.result.payment_type_method_name; - delete this.result.payment_type_method_number; - + mappingTransaction(this.result); return; } diff --git a/src/modules/transaction/transaction/domain/usecases/managers/helpers/mapping-transaction.helper.ts b/src/modules/transaction/transaction/domain/usecases/managers/helpers/mapping-transaction.helper.ts new file mode 100644 index 0000000..9b0de8e --- /dev/null +++ b/src/modules/transaction/transaction/domain/usecases/managers/helpers/mapping-transaction.helper.ts @@ -0,0 +1,63 @@ +export function mappingTransaction(data) { + let payment_type_bank; + const season_period = { + id: data.season_period_id, + holiday_name: data.season_period_name, + season_type: { + id: data.season_period_type_id, + name: data.season_period_type_name, + }, + }; + + if (data.payment_type_method_id) { + payment_type_bank = { + id: data.payment_type_method_id, + issuer_name: data.payment_type_method_name, + account_number: data.payment_type_method_number, + }; + } + + const items = data?.['items']?.map((itemData) => { + let tenant; + + if (itemData.item_tenant_id) { + tenant = { + id: itemData.item_tenant_id, + name: itemData.item_tenant_name, + share_margin: itemData.item_tenant_share_margin, + }; + } + + return { + item: { + id: itemData.item_id, + name: itemData.item_name, + item_type: itemData.item_type, + base_price: itemData.item_price, + hpp: itemData.item_hpp, + tenant: tenant, + item_category: { + id: itemData.item_category_id, + name: itemData.item_category_name, + }, + }, + qty: itemData.qty, + total_price: itemData.total_price, + }; + }); + + Object.assign(data, { + season_period: season_period, + items: items, + payment_type_bank: payment_type_bank, + }); + + delete data.season_period_id; + delete data.season_period_name; + delete data.season_period_type_id; + delete data.season_period_type_name; + + delete data.payment_type_method_id; + delete data.payment_type_method_name; + delete data.payment_type_method_number; +}