diff --git a/src/modules/configuration/couch/couch.module.ts b/src/modules/configuration/couch/couch.module.ts index ac587d5..75e12a6 100644 --- a/src/modules/configuration/couch/couch.module.ts +++ b/src/modules/configuration/couch/couch.module.ts @@ -34,7 +34,9 @@ import { UserDataService } from 'src/modules/user-related/user/data/services/use import { ItemDataService } from 'src/modules/item-related/item/data/services/item-data.service'; import { BookingDeletedEvent, - BookingHandler, + // BookingHandler, + BookingUpdateHandler, + ChangeStatusBookingHandler, } 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'; @@ -59,7 +61,9 @@ import { VipCodeCreatedHandler } from './domain/managers/vip-code.handler'; ], controllers: [CouchDataController], providers: [ - BookingHandler, + // BookingHandler, + BookingUpdateHandler, + ChangeStatusBookingHandler, BookingDeletedEvent, PaymentMethodDeletedHandler, PaymentMethodUpdatedHandler, diff --git a/src/modules/configuration/couch/data/services/couch.service.ts b/src/modules/configuration/couch/data/services/couch.service.ts index 7225d50..3c100be 100644 --- a/src/modules/configuration/couch/data/services/couch.service.ts +++ b/src/modules/configuration/couch/data/services/couch.service.ts @@ -68,4 +68,15 @@ export class CouchService { }); } catch (error) {} } + + public async getDoc(id: string, database: string) { + try { + const nano = this.nanoInstance; + const db = nano.use(database); + const result = await db.get(id); + return result; + } catch (error) { + return null; + } + } } diff --git a/src/modules/configuration/couch/domain/managers/booking.handler.ts b/src/modules/configuration/couch/domain/managers/booking.handler.ts index 2809b23..67639bb 100644 --- a/src/modules/configuration/couch/domain/managers/booking.handler.ts +++ b/src/modules/configuration/couch/domain/managers/booking.handler.ts @@ -2,7 +2,7 @@ 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 { 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'; @@ -25,8 +25,60 @@ export class BookingDeletedEvent } } -@EventsHandler(TransactionChangeStatusEvent, TransactionUpdatedEvent) -export class BookingHandler +// @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 || +// ([STATUS.ACTIVE, STATUS.SETTLED].includes(data.status) && +// data.payment_type != TransactionPaymentType.COUNTER) +// ) { +// const booking = await this.bookingService.getOneByOptions({ +// where: { +// id: data.id, +// }, +// relations: ['items'], +// }); + +// mappingTransaction(booking); + +// if ( +// (old_data?.status != data.status || +// data.payment_type != TransactionPaymentType.COUNTER) && +// [STATUS.PENDING, STATUS.ACTIVE, STATUS.SETTLED].includes(data.status) +// ) { +// await this.couchService.createDoc( +// { +// _id: booking.id, +// ...booking, +// }, +// 'booking', +// ); +// } else { +// await this.couchService.updateDoc( +// { +// _id: booking.id, +// ...booking, +// }, +// 'booking', +// ); +// } +// } +// } +// } + +@EventsHandler(TransactionChangeStatusEvent) +export class ChangeStatusBookingHandler implements IEventHandler { constructor( @@ -35,28 +87,22 @@ export class BookingHandler ) {} async handle(event: TransactionChangeStatusEvent) { - const old_data = event.data.old; const data = event.data.data; + const isFromCounter = data.payment_type == TransactionPaymentType.COUNTER; + const dataID = data?.id; + + if (!isFromCounter) { + const couchData = await this.couchService.getDoc(dataID, 'booking'); - if ( - data.payment_type == TransactionPaymentType.COUNTER || - ([STATUS.ACTIVE, STATUS.SETTLED].includes(data.status) && - data.payment_type != TransactionPaymentType.COUNTER) - ) { const booking = await this.bookingService.getOneByOptions({ where: { id: data.id, }, relations: ['items'], }); - mappingTransaction(booking); - if ( - (old_data?.status != data.status || - data.payment_type != TransactionPaymentType.COUNTER) && - [STATUS.PENDING, STATUS.ACTIVE, STATUS.SETTLED].includes(data.status) - ) { + if (!couchData) { await this.couchService.createDoc( { _id: booking.id, @@ -76,3 +122,38 @@ export class BookingHandler } } } + +@EventsHandler(TransactionUpdatedEvent) +export class BookingUpdateHandler + implements IEventHandler +{ + constructor( + private bookingService: TransactionDataService, + private couchService: CouchService, + ) {} + + async handle(event: TransactionChangeStatusEvent) { + const data = event.data.data; + const dataID = data?.id; + + const couchData = await this.couchService.getDoc(dataID, 'booking'); + + if (couchData) { + const booking = await this.bookingService.getOneByOptions({ + where: { + id: data.id, + }, + relations: ['items'], + }); + + mappingTransaction(booking); + await this.couchService.updateDoc( + { + _id: booking.id, + ...booking, + }, + 'booking', + ); + } + } +} diff --git a/src/modules/transaction/reconciliation/domain/usecases/managers/index-reconciliation.manager.ts b/src/modules/transaction/reconciliation/domain/usecases/managers/index-reconciliation.manager.ts index e85cc90..026de91 100644 --- a/src/modules/transaction/reconciliation/domain/usecases/managers/index-reconciliation.manager.ts +++ b/src/modules/transaction/reconciliation/domain/usecases/managers/index-reconciliation.manager.ts @@ -130,18 +130,18 @@ export class IndexReconciliationManager extends BaseIndexManager { - constructor(private dataService: TransactionDataService) {} + constructor( + private dataService: TransactionDataService, + private eventBus: EventBus, + ) {} async handle(event: RefundChangeStatusEvent) { const current_data = event.data.data; let status: STATUS; + //GET TRANSACTION DATA BEFORE UPDATE + const oldData = current_data?.transaction; + const queryRunner = this.dataService .getRepository() .manager.connection.createQueryRunner(); @@ -47,5 +59,25 @@ export class RefundUpdatedHandler status: status, }, ); + + //GET TRANSACTION DATA AFTER UPDATE + const newData = await this.dataService.getOneByOptions({ + where: { + id: current_data.transaction_id, + }, + relations: ['items'], + }); + + this.eventBus.publish( + new TransactionChangeStatusEvent({ + id: current_data.transaction_id, + old: oldData, + data: newData, + user: BLANK_USER, + description: 'Refund Callback', + module: TABLE_NAME.TRANSACTION, + op: OPERATION.UPDATE, + }), + ); } }