Compare commits

..

3 Commits

6 changed files with 98 additions and 4 deletions

View File

@ -0,0 +1,66 @@
import { Injectable } from '@nestjs/common';
import { RelationParam } from 'src/core/modules/domain/entities/base-filter.entity';
import { PaginationResponse } from 'src/core/response/domain/ok-response.interface';
import { ItemEntity } from 'src/modules/item-related/item/domain/entities/item.entity';
import { IndexItemManager } from 'src/modules/item-related/item/domain/usecases/managers/index-item.manager';
import { SelectQueryBuilder } from 'typeorm';
@Injectable()
export class BookingItemManager extends IndexItemManager {
get relations(): RelationParam {
return {
// relation only join (for query purpose)
joinRelations: [],
// relation join and select (relasi yang ingin ditampilkan),
selectRelations: [
'item_category',
'bundling_items',
'tenant',
'time_group',
'item_rates',
],
// relation yang hanya ingin dihitung (akan return number)
countRelations: [],
};
}
get selects(): string[] {
const parent = super.selects;
return [
...parent,
'item_rates.id',
'item_rates.price',
'item_rates.season_period_id',
];
}
getResult(): PaginationResponse<ItemEntity> {
const result = super.getResult();
const { data, total } = result;
const hasRates = (this.filterParam.season_period_ids?.length ?? 0) > 0;
const items = data.map((item) => {
const { item_rates, ...rest } = item;
const rate = item_rates?.[0]?.['price'] ?? rest.base_price;
return {
...rest,
base_price: hasRates ? rate : rest.base_price,
};
});
return { total, data: items };
}
setQueryFilter(
queryBuilder: SelectQueryBuilder<ItemEntity>,
): SelectQueryBuilder<ItemEntity> {
const query = super.setQueryFilter(queryBuilder);
if (this.filterParam.season_period_ids) {
query.andWhere(`item_rates.season_period_id In (:...seasonIds)`, {
seasonIds: this.filterParam.season_period_ids,
});
}
return query;
}
}

View File

@ -5,15 +5,15 @@ import { PaginationResponse } from 'src/core/response/domain/ok-response.interfa
import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants';
import { ItemReadService } from 'src/modules/item-related/item/data/services/item-read.service'; import { ItemReadService } from 'src/modules/item-related/item/data/services/item-read.service';
import { ItemEntity } from 'src/modules/item-related/item/domain/entities/item.entity'; import { ItemEntity } from 'src/modules/item-related/item/domain/entities/item.entity';
import { IndexItemManager } from 'src/modules/item-related/item/domain/usecases/managers/index-item.manager';
import { FilterItemDto } from 'src/modules/item-related/item/infrastructure/dto/filter-item.dto'; import { FilterItemDto } from 'src/modules/item-related/item/infrastructure/dto/filter-item.dto';
import { BookingItemManager } from '../domain/usecases/managers/booking-item.manager';
@ApiTags('Booking Item') @ApiTags('Booking Item')
@Controller('v1/booking-item') @Controller('v1/booking-item')
@Public(true) @Public(true)
export class ItemController { export class ItemController {
constructor( constructor(
private indexManager: IndexItemManager, private indexManager: BookingItemManager,
private serviceData: ItemReadService, private serviceData: ItemReadService,
) {} ) {}

View File

@ -131,11 +131,17 @@ export class BookingOrderController {
@Get(':id') @Get(':id')
async get(@Param('id') transactionId: string) { async get(@Param('id') transactionId: string) {
const data = await this.serviceData.getOneByOptions({ const data = await this.serviceData.getOneByOptions({
relations: ['items', 'items.item', 'items.item.time_group'], relations: [
'items',
'parent_transaction',
'items.item',
'items.item.time_group',
],
where: { id: transactionId }, where: { id: transactionId },
}); });
const { const {
parent_id,
customer_name, customer_name,
customer_phone, customer_phone,
booking_date, booking_date,
@ -143,6 +149,7 @@ export class BookingOrderController {
status, status,
id, id,
items, items,
parent_transaction,
} = data; } = data;
let timeGroup = null; let timeGroup = null;
@ -195,6 +202,20 @@ export class BookingOrderController {
maskedCustomerPhone = '*'.repeat(customer_phone.length - 4) + last4; maskedCustomerPhone = '*'.repeat(customer_phone.length - 4) + last4;
} }
let parentTransaction = undefined;
if (parent_transaction) {
const {
id: parentId,
invoice_code: parentInvoiceCode,
invoice_date: parentInvoiceDate,
} = parent_transaction;
parentTransaction = {
id: parentId,
invoice_code: parentInvoiceCode,
invoice_date: parentInvoiceDate,
};
}
return { return {
customer_name, customer_name,
customer_phone: maskedCustomerPhone, customer_phone: maskedCustomerPhone,
@ -202,8 +223,10 @@ export class BookingOrderController {
invoice_code, invoice_code,
status, status,
id, id,
is_reschedule: !!parent_id,
items: usageItems, items: usageItems,
time_group: timeGroup, time_group: timeGroup,
parent: parentTransaction,
}; };
} }

View File

@ -14,6 +14,7 @@ import { CqrsModule } from '@nestjs/cqrs';
import { RescheduleVerificationModel } from './data/models/reschedule-verification.model'; import { RescheduleVerificationModel } from './data/models/reschedule-verification.model';
import { RescheduleVerificationManager } from './domain/usecases/managers/reschedule-verification.manager'; import { RescheduleVerificationManager } from './domain/usecases/managers/reschedule-verification.manager';
import { RescheduleManager } from './domain/usecases/managers/reschedule.manager'; import { RescheduleManager } from './domain/usecases/managers/reschedule.manager';
import { BookingItemManager } from './domain/usecases/managers/booking-item.manager';
@Module({ @Module({
imports: [ imports: [
ConfigModule.forRoot(), ConfigModule.forRoot(),
@ -31,6 +32,7 @@ import { RescheduleManager } from './domain/usecases/managers/reschedule.manager
CreateBookingManager, CreateBookingManager,
RescheduleVerificationManager, RescheduleVerificationManager,
RescheduleManager, RescheduleManager,
BookingItemManager,
], ],
}) })
export class BookingOrderModule {} export class BookingOrderModule {}

View File

@ -1,6 +1,7 @@
import { BaseStatusEntity } from 'src/core/modules/domain/entities/base-status.entity'; import { BaseStatusEntity } from 'src/core/modules/domain/entities/base-status.entity';
import { ItemType } from 'src/modules/item-related/item-category/constants'; import { ItemType } from 'src/modules/item-related/item-category/constants';
import { LimitType } from '../../constants'; import { LimitType } from '../../constants';
import { ItemRateEntity } from 'src/modules/item-related/item-rate/domain/entities/item-rate.entity';
export interface ItemEntity extends BaseStatusEntity { export interface ItemEntity extends BaseStatusEntity {
name: string; name: string;
@ -19,4 +20,6 @@ export interface ItemEntity extends BaseStatusEntity {
show_to_booking: boolean; show_to_booking: boolean;
breakdown_bundling?: boolean; breakdown_bundling?: boolean;
booking_description?: string; booking_description?: string;
item_rates?: ItemRateEntity[] | any[];
} }

View File

@ -110,7 +110,7 @@ export class IndexItemManager extends BaseIndexManager<ItemEntity> {
if (this.filterParam.time_group_ids?.length) { if (this.filterParam.time_group_ids?.length) {
queryBuilder.andWhere( queryBuilder.andWhere(
`${this.tableName}.time_group_id In (:...timeGroupIds) OR ${this.tableName}.time_group_id Is Null`, `(${this.tableName}.time_group_id In (:...timeGroupIds) OR ${this.tableName}.time_group_id Is Null)`,
{ {
timeGroupIds: this.filterParam.time_group_ids, timeGroupIds: this.filterParam.time_group_ids,
}, },