pos-be/src/modules/queue/data/services/ticket.service.ts

327 lines
7.9 KiB
TypeScript

import { Injectable, UnprocessableEntityException } from '@nestjs/common';
import { BaseDataService } from 'src/core/modules/data/service/base-data.service';
import { InjectRepository } from '@nestjs/typeorm';
import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants';
import { Between, In, IsNull, Like, Not, Repository } from 'typeorm';
import { QueueTicket } from '../../domain/entities/ticket.entity';
import {
QueueItemModel,
QueueOrderModel,
QueueTicketModel,
} from '../models/queue.model';
import { QueueOrder } from '../../domain/entities/order.entity';
import * as moment from 'moment';
import { TransactionModel } from 'src/modules/transaction/transaction/data/models/transaction.model';
@Injectable()
export class TicketDataService extends BaseDataService<QueueTicket> {
constructor(
@InjectRepository(QueueTicketModel, CONNECTION_NAME.DEFAULT)
private repo: Repository<QueueTicketModel>,
@InjectRepository(QueueOrderModel, CONNECTION_NAME.DEFAULT)
private order: Repository<QueueOrderModel>,
@InjectRepository(QueueItemModel, CONNECTION_NAME.DEFAULT)
private item: Repository<QueueItemModel>,
@InjectRepository(TransactionModel, CONNECTION_NAME.DEFAULT)
private transaction: Repository<TransactionModel>,
) {
super(repo);
}
async createQueueOrder(order: QueueOrder): Promise<QueueOrderModel> {
return await this.order.save(order);
}
async updateQueueTicket(ticket: QueueTicket): Promise<QueueTicketModel> {
return await this.repo.save(ticket);
}
async loginQueue(id: string): Promise<QueueOrder> {
const order = await this.order.findOne({
relations: ['tickets'],
where: [
{ transaction_id: id },
{ code: id, transaction_id: Not(IsNull()) },
],
});
if (!order) {
const { customer_name, customer_phone } =
await this.transaction.findOneOrFail({
where: {
id,
},
});
const start = moment().startOf('day').valueOf();
const end = moment().endOf('day').valueOf();
const order = this.order.findOneOrFail({
relations: ['tickets'],
where: {
customer: customer_name,
phone: customer_phone,
date: Between(start, end),
},
});
return order;
}
return order;
}
async ticketByCode(code: string): Promise<QueueTicketModel[]> {
return this.repo.find({
where: {
code: Like(`${code}%`),
},
});
}
async printTicket(id: string): Promise<QueueTicketModel[]> {
const tickets = await this.repo.find({
where: {
order_id: id,
is_printed: false,
},
});
await this.repo.update(
{ order_id: id, is_printed: false },
{ is_printed: true },
);
if (tickets.length < 1)
throw new UnprocessableEntityException({
code: 2,
message: 'Semua ticket sudah di print',
});
return tickets;
}
async ticketByUser(user: string, phone: string): Promise<QueueTicket> {
const start = moment().startOf('day').valueOf();
const end = moment().endOf('day').valueOf();
return this.repo.findOne({
relations: ['items', 'order'],
where: {
customer: user,
phone: phone,
date: Between(start, end),
},
});
}
async loginPhone(user: string, phone: string): Promise<QueueOrder> {
const start = moment().startOf('day').valueOf();
const end = moment().endOf('day').valueOf();
return this.order.findOneOrFail({
relations: ['tickets'],
where: {
customer: user,
phone: `+${phone}`,
date: Between(start, end),
},
});
}
async orders(order_id: string): Promise<QueueOrderModel[]> {
const order = await this.order.findOneOrFail({
where: {
id: order_id,
},
});
if (order.transaction_id != null) {
return this.order.find({
where: {
code: order.code,
},
});
}
return [order];
}
async transactions(transaction_id: string): Promise<QueueOrderModel[]> {
const order = await this.order.findOneOrFail({
where: {
transaction_id,
},
});
if (order.transaction_id != null) {
return this.order.find({
where: {
code: order.code,
},
});
}
return [order];
}
async deleteQueue(transaction_id: string): Promise<void> {
try {
const transactions = await this.transactions(transaction_id);
await this.order.remove(transactions);
} catch (error) {
console.log('transaction not found');
}
}
async orderIds(order_id: string): Promise<string[]> {
const orders = await this.orders(order_id);
return orders.map((order) => order.id);
}
async orderItems(
order_id: string,
item_ids: string[],
): Promise<QueueOrderModel> {
const order = await this.orderIds(order_id);
try {
const ticket = await this.order.findOneOrFail({
relations: ['tickets', 'tickets.items'],
where: {
tickets: {
order_id: In(order),
items: {
id: In(item_ids),
},
},
},
});
return ticket;
} catch (error) {
throw new UnprocessableEntityException('Ticket tidak dapat ditemukan');
}
}
async queuePosTickets(order_id: string): Promise<QueueTicketModel[]> {
return this.repo.find({
relations: [
'items',
'items.queue',
'items.item',
'items.item.item_queue',
],
where: {
order_id,
},
});
}
async queueTickets(order_id: string): Promise<QueueTicketModel[]> {
const order = await this.orderIds(order_id);
const start = moment().startOf('day').valueOf();
const end = moment().endOf('day').valueOf();
return this.repo.find({
relations: [
'items',
'items.queue',
'items.item',
'items.item.item_queue',
],
where: {
order_id: In(order),
date: Between(start, end),
},
});
}
async queueUniqueTickets(order_id: string): Promise<QueueTicketModel[]> {
const start = moment().startOf('day').valueOf();
const end = moment().endOf('day').valueOf();
return this.repo.find({
relations: [
'items',
'items.queue',
'items.item',
'items.item.item_queue',
],
where: {
order_id: order_id,
date: Between(start, end),
},
});
}
async queueTicketItems(
order_id: string,
ticket_id: string,
): Promise<QueueTicketModel[]> {
const order = await this.orderIds(order_id);
return this.repo.find({
relations: [
'items',
'items.queue',
'items.item',
'items.item.item_queue',
],
where: {
order_id: In(order),
id: ticket_id,
},
});
}
async queueTicketActive(
order_id: string,
ticket_id: string,
): Promise<QueueTicketModel[]> {
// const order = await this.orderIds(order_id);
return this.repo.find({
relations: ['items', 'items.queue'],
where: {
// order_id: In(order),
id: ticket_id,
// items: {
// queue: {
// status: In(['waiting']),
// },
// },
},
});
}
async queueItemTickets(
order_id: string,
item_id: string,
): Promise<QueueTicketModel[]> {
const order = await this.orderIds(order_id);
return this.repo.find({
relations: [
'items',
'items.queue',
'items.item',
'items.item.item_queue',
],
where: {
order_id: In(order),
items: [{ item_id }, { item: { item_queue: { id: item_id } } }],
},
});
}
async queueItems(order_id: string): Promise<QueueItemModel[]> {
const order = await this.orderIds(order_id);
return this.item.find({
relations: ['queue', 'ticket'],
where: {
ticket: {
order_id: In(order),
},
},
});
}
}