From b4f141e628020bef59dd032f55f30a278e6ba11e Mon Sep 17 00:00:00 2001 From: shancheas Date: Tue, 26 Nov 2024 12:40:02 +0700 Subject: [PATCH] feat(SPG-1061): add bundling to queue --- .../handlers/transaction.handler.ts | 58 +++++++++++++++---- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/src/modules/queue/infrastructure/handlers/transaction.handler.ts b/src/modules/queue/infrastructure/handlers/transaction.handler.ts index d6413e9..b3e5b42 100644 --- a/src/modules/queue/infrastructure/handlers/transaction.handler.ts +++ b/src/modules/queue/infrastructure/handlers/transaction.handler.ts @@ -16,6 +16,7 @@ import { QueueService } from '../../data/services/queue.service'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { QueueBucketReadService } from '../../data/services/queue-bucket'; import { QueueTimeFormula } from '../../domain/usecases/formula/queue-time.formula'; +import { TransactionItemModel } from 'src/modules/transaction/transaction/data/models/transaction-item.model'; @EventsHandler(TransactionChangeStatusEvent, TransactionCreateQueueEvent) export class QueueTransactionHandler @@ -41,7 +42,12 @@ export class QueueTransactionHandler where: { id: event.data.id, }, - relations: ['customer_category', 'items', 'items.item'], + relations: [ + 'customer_category', + 'items', + 'items.item', + 'items.item.bundling_items', + ], }); const date = transaction.booking_date ?? transaction.invoice_date; @@ -57,15 +63,7 @@ export class QueueTransactionHandler transaction_id: id, }; - const items = transaction.items - .filter((item) => item.item.use_queue) - .map((item) => { - return { - item_queue_id: item.item.item_queue_id, - item_id: item.item_id, - qty: item.qty, - }; - }); + const items = this.generateItems(transaction.items); const existTicket = await this.ticketService.ticketByUser( customer_name, @@ -117,6 +115,46 @@ export class QueueTransactionHandler } } + generateItems(items: TransactionItemModel[]): QueueItem[] { + const transactionItems = []; + + items.forEach((item) => { + if (item.item.use_queue) { + transactionItems.push({ + item_queue_id: item.item.item_queue_id, + item_id: item.item_id, + qty: item.qty, + }); + } + + if (item.item.bundling_items.length > 0) { + item.item.bundling_items.forEach((bundling_item) => { + if (bundling_item.use_queue) { + transactionItems.push({ + item_queue_id: bundling_item.item_queue_id, + item_id: bundling_item.id, + qty: item.qty, + }); + } + }); + } + }); + + return this.mergeQueueItems(transactionItems); + } + + mergeQueueItems(arr) { + const result = {}; + arr.forEach((item) => { + if (result[item.item_id]) { + result[item.item_id].qty += item.qty; + } else { + result[item.item_id] = { ...item }; + } + }); + return Object.values(result); + } + async create(data: RegisterQueueDto): Promise { const queue = await this.queueService.getTicketItems( data.ticket_id,