import { Injectable } from '@nestjs/common'; import { BaseIndexManager } from 'src/core/modules/domain/usecase/managers/base-index.manager'; import { SelectQueryBuilder } from 'typeorm'; import { Param, RelationParam, } from 'src/core/modules/domain/entities/base-filter.entity'; import { Queue } from '../entities/queue.entity'; import * as moment from 'moment'; import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; @Injectable() export class IndexQueueManager extends BaseIndexManager { private queueTimes = {}; async prepareData(): Promise { return; } async beforeProcess(): Promise { return; } async afterProcess(): Promise { this.queueTimes = await this.dataService.queueTimes( this.filterParam.queue_id, ); return; } get relations(): RelationParam { return { joinRelations: [], selectRelations: ['item', 'item.ticket'], countRelations: [], }; } getResult(): PaginationResponse { const result = this.result; return { total: result.total, data: result.data.map((queue) => { return { ...queue, time: this.queueTimes[queue.id], }; }), }; } get selects(): string[] { return [ `${this.tableName}.id`, `${this.tableName}.code`, `${this.tableName}.status`, `${this.tableName}.time`, `${this.tableName}.call_time`, `${this.tableName}.vip`, `${this.tableName}.item`, `${this.tableName}.qty`, `${this.tableName}.created_at`, `item.id`, `ticket.customer`, `ticket.phone`, ]; } get specificFilter(): Param[] { return [ { cols: `${this.tableName}.status`, data: this.filterParam.status, }, ]; } setQueryFilter( queryBuilder: SelectQueryBuilder, ): SelectQueryBuilder { const start = moment().startOf('day').valueOf(); const end = moment().endOf('day').valueOf(); console.log({ start, end, item_queue_id: this.filterParam.queue_id }); queryBuilder.andWhere(`${this.tableName}.time BETWEEN :start AND :end`, { start, end, }); queryBuilder.andWhere(`${this.tableName}.item_queue_id = :item_queue_id`, { item_queue_id: this.filterParam.queue_id, }); if (this.filterParam.vip != null) { queryBuilder.andWhere(`${this.tableName}.vip = :vip`, { vip: this.filterParam.vip, }); } return queryBuilder; } }