fix(SPG-1044): validate split QR when phone and username exist
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details

pull/115/head 1.2.8-alpha.1
shancheas 2024-11-21 11:31:29 +07:00
parent cb452cf5f3
commit 4eedca12e7
1 changed files with 31 additions and 4 deletions

View File

@ -1,4 +1,8 @@
import { Injectable } from '@nestjs/common'; import {
HttpStatus,
Injectable,
UnprocessableEntityException,
} from '@nestjs/common';
import { import {
EventTopics, EventTopics,
columnUniques, columnUniques,
@ -9,11 +13,15 @@ import { BaseCreateManager } from 'src/core/modules/domain/usecase/managers/base
import { QueueOrderModel } from '../../data/models/queue.model'; import { QueueOrderModel } from '../../data/models/queue.model';
import { SplitQueueDto } from '../../infrastructure/controllers/dto/split-queue.dto'; import { SplitQueueDto } from '../../infrastructure/controllers/dto/split-queue.dto';
import { QueueService } from '../../data/services/queue.service'; import { QueueService } from '../../data/services/queue.service';
import { TicketDataService } from '../../data/services/ticket.service';
@Injectable() @Injectable()
export class SplitQueueManager extends BaseCreateManager<QueueOrderModel> { export class SplitQueueManager extends BaseCreateManager<QueueOrderModel> {
private dto: SplitQueueDto; private dto: SplitQueueDto;
constructor(private readonly queueService: QueueService) { constructor(
private readonly queueService: QueueService,
private readonly ticketService: TicketDataService,
) {
super(); super();
} }
@ -21,7 +29,25 @@ export class SplitQueueManager extends BaseCreateManager<QueueOrderModel> {
this.dto = dto; this.dto = dto;
} }
prepareData(): Promise<void> { async validateProcess(): Promise<void> {
await super.validateProcess();
const existTickets = await this.ticketService.ticketByUser(
this.dto.name,
this.dto.phone,
);
if (existTickets) {
throw new UnprocessableEntityException({
statusCode: HttpStatus.UNPROCESSABLE_ENTITY,
code: 20002,
message:
'Antrian dengan nama dan nomor telepon sudah terdaftar, silahkan gunakan nomor telepon atau nama lain',
error: 'QUEUE_ALREADY_EXIST',
});
}
}
async prepareData(): Promise<void> {
const existTickets = await this.ticketService.ticketByCode(this.data.code);
const { tickets, ...order } = this.data; const { tickets, ...order } = this.data;
const ticket = tickets[0]; const ticket = tickets[0];
const items = tickets const items = tickets
@ -29,6 +55,7 @@ export class SplitQueueManager extends BaseCreateManager<QueueOrderModel> {
return ticket.items; return ticket.items;
}) })
.flat(); .flat();
const postfix = existTickets.length;
this.data = { this.data = {
code: order.code, code: order.code,
customer: this.dto.name, customer: this.dto.name,
@ -37,7 +64,7 @@ export class SplitQueueManager extends BaseCreateManager<QueueOrderModel> {
updated_at: new Date().getTime(), updated_at: new Date().getTime(),
tickets: [ tickets: [
{ {
code: `${order.code}-1`, code: `${order.code}-${postfix}`,
customer: this.dto.name, customer: this.dto.name,
phone: this.dto.phone, phone: this.dto.phone,
date: ticket.date, date: ticket.date,