import { Injectable, UnauthorizedException } from '@nestjs/common'; import { TicketDataService } from '../data/services/ticket.service'; import { QueueOrder } from './entities/order.entity'; import { Queue } from './entities/queue.entity'; import { QueueOrderService, QueueService, } from '../data/services/queue.service'; import { RegisterQueueManager } from './usecases/register-queue.manager'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { RegisterQueueDto } from '../infrastructure/controllers/dto/register-queue.dto'; import { CustomerQueueSummaryManager } from './usecases/queue/customer-queue-summary.manager'; import { CustomerQueueDetailManager } from './usecases/queue/customer-queue-detail.manager'; import { CustomerQueueItemManager } from './usecases/queue/customer-queue-item.manager'; import { CustomerQueueItemListManager } from './usecases/queue/customer-queue-item-list.manager'; import { CustomerQueueListManager } from './usecases/queue/customer-queue-list.manager'; import { SplitQueueDto } from '../infrastructure/controllers/dto/split-queue.dto'; import { SplitQueueManager } from './usecases/split-queue.manager'; import { LoginQueueDto } from '../infrastructure/controllers/dto/login-queue.dto'; import * as moment from 'moment'; import { CustomerQueueTicketSummaryManager } from './usecases/queue/customer-queue-ticket.manager'; import { TransactionDataService } from 'src/modules/transaction/transaction/data/services/transaction-data.service'; import { CustomerQueuePosItemManager } from './usecases/queue/customer-queue-pos-item.manager'; import { QueueTicketModel } from '../data/models/queue.model'; @Injectable() export class QueueOrchestrator { constructor( public readonly dataService: TicketDataService, public readonly transactionService: TransactionDataService, private readonly queueService: QueueService, private readonly queueOrderService: QueueOrderService, private readonly registerQueueManager: RegisterQueueManager, private readonly splitQueueManager: SplitQueueManager, ) {} async loginCustomer(id: string): Promise { try { const order = await this.dataService.loginQueue(id); const tickets = await this.dataService.ticketByCode(order.code); order.tickets = tickets; return order; } catch (error) { throw new UnauthorizedException({ message: 'Invoice tidak ditemukan', error: 'INVOICE_NOT_FOUND', }); } } async loginPhone(login: LoginQueueDto): Promise { const { name, phone } = login; const now = moment().format('DD/MM/YYYY'); try { return await this.dataService.loginPhone(name, phone); } catch (error) { throw new UnauthorizedException({ message: `Antrian atas nama ${name} dan nomor telepon ${phone} pada tanggal ${now} tidak ditemukan`, error: 'INVOICE_NOT_FOUND', }); } } async create(data: RegisterQueueDto): Promise { const queue = await this.queueService.getTicketItems( data.ticket_id, data.item_id, ); const queueRequest: any = { qty: data.qty, item_id: queue.id, }; this.registerQueueManager.setData(queueRequest); this.registerQueueManager.setService(this.queueService, TABLE_NAME.QUEUE); await this.registerQueueManager.execute(); return this.registerQueueManager.getResult(); } async split(data: SplitQueueDto): Promise { const queueIds = data.items.map((i) => i.queue_item_id); const queue = await this.dataService.orderItems(data.order_id, queueIds); this.splitQueueManager.setRequestData(data); this.splitQueueManager.setData(queue); this.splitQueueManager.setService( this.queueOrderService, TABLE_NAME.QUEUE_ORDER, ); await this.splitQueueManager.execute(); return this.splitQueueManager.getResult(); } async queuePOSTickets(order_id: string): Promise { const tickets = await this.dataService.queuePosTickets(order_id); const manager = new CustomerQueuePosItemManager(tickets); return manager.data; } async queueTickets(order_id: string): Promise { const tickets = await this.dataService.queueTickets(order_id); const manager = new CustomerQueueSummaryManager(tickets); return manager.data; } async queueTicketDetail(order_id: string, ticket_id: string): Promise { const tickets = await this.dataService.queueTicketItems( order_id, ticket_id, ); const queueItemIds = this.getQueueItemFromTickets(tickets); const queues = await this.queueService.queues(queueItemIds); const manager = new CustomerQueueDetailManager(tickets); manager.currentQueues(queues); return manager.data; } async queueTicketSummary(order_id: string, ticket_id: string): Promise { const tickets = await this.dataService.queueTicketActive( order_id, ticket_id, ); const manager = new CustomerQueueTicketSummaryManager(tickets); return manager.data; } async queueItemDetail(order_id: string, item_id: string): Promise { const tickets = await this.dataService.queueItemTickets(order_id, item_id); const manager = new CustomerQueueItemManager(tickets); return manager.data; } async queueItems(order_id: string): Promise { const tickets = await this.dataService.queueTickets(order_id); const queueItemIds = this.getQueueItemFromTickets(tickets); const queues = await this.queueService.queues(queueItemIds); const manager = new CustomerQueueItemListManager(tickets); manager.currentQueues(queues); return manager.data; } async queueOrderItems(order_id: string): Promise { const tickets = await this.dataService.queueTickets(order_id); const manager = new CustomerQueueListManager(tickets); return manager.data; } getQueueItemFromTickets(tickets: QueueTicketModel[]) { const queueItemIds = tickets.map((ticket) => { return ticket.items.map((item) => { return item.item.item_queue_id; }); }); return queueItemIds.flat(); } }