feat: vip auto enter queue
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details

pull/115/head 20.2.11-alpha.1
shancheas 2024-11-11 14:43:15 +07:00
parent c129a59d47
commit 6c53610ec4
3 changed files with 48 additions and 9 deletions

View File

@ -9,6 +9,7 @@ import { QueueOrder } from '../../domain/entities/order.entity';
import { QueueTicket } from '../../domain/entities/ticket.entity'; import { QueueTicket } from '../../domain/entities/ticket.entity';
import { QueueItem } from '../../domain/entities/queue-item.entity'; import { QueueItem } from '../../domain/entities/queue-item.entity';
import * as moment from 'moment'; import * as moment from 'moment';
import { QueueOrchestrator } from '../../domain/queue.orchestrator';
@EventsHandler(TransactionChangeStatusEvent, TransactionCreateQueueEvent) @EventsHandler(TransactionChangeStatusEvent, TransactionCreateQueueEvent)
export class QueueTransactionHandler export class QueueTransactionHandler
@ -17,6 +18,7 @@ export class QueueTransactionHandler
constructor( constructor(
private dataService: TransactionDataService, private dataService: TransactionDataService,
private queueService: TicketDataService, private queueService: TicketDataService,
private orchestrator: QueueOrchestrator,
) {} ) {}
async handle(event: TransactionChangeStatusEvent) { async handle(event: TransactionChangeStatusEvent) {
@ -31,7 +33,7 @@ export class QueueTransactionHandler
where: { where: {
id: event.data.id, id: event.data.id,
}, },
relations: ['items'], relations: ['customer_category', 'items', 'items.item'],
}); });
const date = transaction.booking_date ?? transaction.invoice_date; const date = transaction.booking_date ?? transaction.invoice_date;
@ -47,7 +49,9 @@ export class QueueTransactionHandler
transaction_id: id, transaction_id: id,
}; };
const items = transaction.items.map<QueueItem>((item) => { const items = transaction.items
.filter((item) => item.item.use_queue)
.map<QueueItem>((item) => {
return { return {
item_id: item.item_id, item_id: item.item_id,
qty: item.qty, qty: item.qty,
@ -57,6 +61,24 @@ export class QueueTransactionHandler
const ticket: QueueTicket = { ...customerOrder, items }; const ticket: QueueTicket = { ...customerOrder, items };
const order: QueueOrder = { ...customerOrder, tickets: [ticket] }; const order: QueueOrder = { ...customerOrder, tickets: [ticket] };
this.queueService.createQueueOrder(order); const queueOrder = await this.queueService.createQueueOrder(order);
if (transaction.customer_category?.has_vip_pass) {
queueOrder.tickets.forEach((ticket) => {
const ticket_id = ticket.id;
ticket.items.forEach((item) => {
const item_id = item.item_id;
for (let i = 0; i < item.qty; i++) {
const payload = {
item_id,
ticket_id,
qty: 1,
};
this.orchestrator.create(payload);
}
});
});
}
} }
} }

View File

@ -8,6 +8,7 @@ import {
import { TransactionModel } from './transaction.model'; import { TransactionModel } from './transaction.model';
import { RefundItemModel } from 'src/modules/transaction/refund/data/models/refund-item.model'; import { RefundItemModel } from 'src/modules/transaction/refund/data/models/refund-item.model';
import { TransactionTaxEntity } from '../../domain/entities/transaction-tax.entity'; import { TransactionTaxEntity } from '../../domain/entities/transaction-tax.entity';
import { ItemModel } from 'src/modules/item-related/item/data/models/item.model';
@Entity(TABLE_NAME.TRANSACTION_ITEM) @Entity(TABLE_NAME.TRANSACTION_ITEM)
export class TransactionItemModel export class TransactionItemModel
@ -126,6 +127,10 @@ export class TransactionItemModel
onUpdate: 'CASCADE', onUpdate: 'CASCADE',
}) })
item_taxes: TransactionItemTaxModel[]; item_taxes: TransactionItemTaxModel[];
@ManyToOne(() => ItemModel)
@JoinColumn({ name: 'item_id' })
item: ItemModel;
} }
@Entity(TABLE_NAME.TRANSACTION_ITEM_BREAKDOWN) @Entity(TABLE_NAME.TRANSACTION_ITEM_BREAKDOWN)

View File

@ -1,6 +1,13 @@
import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants';
import { TransactionEntity } from '../../domain/entities/transaction.entity'; import { TransactionEntity } from '../../domain/entities/transaction.entity';
import { Column, Entity, OneToMany, OneToOne } from 'typeorm'; import {
Column,
Entity,
JoinColumn,
ManyToOne,
OneToMany,
OneToOne,
} from 'typeorm';
import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model'; import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model';
import { import {
TransactionType, TransactionType,
@ -12,6 +19,7 @@ import { TransactionTaxModel } from './transaction-tax.model';
import { STATUS } from 'src/core/strings/constants/base.constants'; import { STATUS } from 'src/core/strings/constants/base.constants';
import { RefundModel } from 'src/modules/transaction/refund/data/models/refund.model'; import { RefundModel } from 'src/modules/transaction/refund/data/models/refund.model';
import { TransactionDemographyModel } from './transaction-demography.model'; import { TransactionDemographyModel } from './transaction-demography.model';
import { VipCategoryModel } from 'src/modules/transaction/vip-category/data/models/vip-category.model';
@Entity(TABLE_NAME.TRANSACTION) @Entity(TABLE_NAME.TRANSACTION)
export class TransactionModel export class TransactionModel
@ -51,6 +59,10 @@ export class TransactionModel
@Column('varchar', { name: 'season_period_type_name', nullable: true }) @Column('varchar', { name: 'season_period_type_name', nullable: true })
season_period_type_name: string; season_period_type_name: string;
@ManyToOne(() => TransactionDemographyModel)
@JoinColumn({ name: 'customer_category_id' })
customer_category: VipCategoryModel;
// customer info // customer info
@Column('enum', { @Column('enum', {
name: 'customer_type', name: 'customer_type',