diff --git a/src/modules/item-related/item-rate/data/services/item-rate-data.service.ts b/src/modules/item-related/item-rate/data/services/item-rate-data.service.ts index 1c8862f..3e7668a 100644 --- a/src/modules/item-related/item-rate/data/services/item-rate-data.service.ts +++ b/src/modules/item-related/item-rate/data/services/item-rate-data.service.ts @@ -4,14 +4,64 @@ import { ItemRateEntity } from '../../domain/entities/item-rate.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { ItemRateModel } from '../models/item-rate.model'; import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; -import { Repository } from 'typeorm'; +import { In, Repository } from 'typeorm'; +import { ItemModel } from 'src/modules/item-related/item/data/models/item.model'; @Injectable() export class ItemRateDataService extends BaseDataService { constructor( @InjectRepository(ItemRateModel, CONNECTION_NAME.DEFAULT) private repo: Repository, + @InjectRepository(ItemModel, CONNECTION_NAME.DEFAULT) + private itemRepo: Repository, ) { super(repo); } + + async itemsRateTotal(season_id: string, items: string[]): Promise { + const rates = await this.repo.find({ + where: { + season_period_id: season_id, + item_id: In(items), + }, + }); + + return rates.reduce((total, current) => total + Number(current.price), 0); + } + + async updateRatesBySeasonItem( + season_id: string, + item_id: string, + price: number, + ): Promise { + this.repo.update( + { + season_period_id: season_id, + item_id, + }, + { price }, + ); + } + + async findBundlingByItem(item_id: string): Promise { + const bundlings = await this.itemRepo.find({ + where: { + breakdown_bundling: true, + bundling_items: { + id: item_id, + }, + }, + }); + + return Promise.all( + await bundlings.map(async (bundling) => { + return await this.itemRepo.findOne({ + relations: ['bundling_items'], + where: { + id: bundling.id, + }, + }); + }), + ); + } } diff --git a/src/modules/item-related/item-rate/domain/usecases/item-rate-data.orchestrator.ts b/src/modules/item-related/item-rate/domain/usecases/item-rate-data.orchestrator.ts index f383d6f..b24ff1c 100644 --- a/src/modules/item-related/item-rate/domain/usecases/item-rate-data.orchestrator.ts +++ b/src/modules/item-related/item-rate/domain/usecases/item-rate-data.orchestrator.ts @@ -5,7 +5,6 @@ import { ItemRateEntity } from '../entities/item-rate.entity'; import { DeleteItemRateManager } from './managers/delete-item-rate.manager'; import { UpdateItemRateManager } from './managers/update-item-rate.manager'; import { BaseDataOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-data.orchestrator'; -import { STATUS } from 'src/core/strings/constants/base.constants'; import { BatchResult } from 'src/core/response/domain/ok-response.interface'; import { BatchDeleteItemRateManager } from './managers/batch-delete-item-rate.manager'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; diff --git a/src/modules/item-related/item-rate/domain/usecases/managers/update-item-rate.manager.ts b/src/modules/item-related/item-rate/domain/usecases/managers/update-item-rate.manager.ts index 42c13c5..5768aa4 100644 --- a/src/modules/item-related/item-rate/domain/usecases/managers/update-item-rate.manager.ts +++ b/src/modules/item-related/item-rate/domain/usecases/managers/update-item-rate.manager.ts @@ -20,6 +20,7 @@ export class UpdateItemRateManager extends BaseUpdateManager { } async afterProcess(): Promise { + this.updateBundlingBreakdown(this.dataId); return; } @@ -42,4 +43,25 @@ export class UpdateItemRateManager extends BaseUpdateManager { }, ]; } + + async updateBundlingBreakdown(id: string) { + const { item_id, season_period_id } = + await this.dataService.getOneByOptions({ + where: { id }, + }); + const bundlings = await this.dataService.findBundlingByItem(item_id); + + for (const bundling of bundlings) { + const ids = bundling.bundling_items.map((item) => item.id); + const totalRates = await this.dataService.itemsRateTotal( + season_period_id, + ids, + ); + this.dataService.updateRatesBySeasonItem( + season_period_id, + bundling.id, + totalRates, + ); + } + } } diff --git a/src/modules/item-related/item-rate/infrastructure/item-rate-data.controller.ts b/src/modules/item-related/item-rate/infrastructure/item-rate-data.controller.ts index 82dfa2b..d8252a3 100644 --- a/src/modules/item-related/item-rate/infrastructure/item-rate-data.controller.ts +++ b/src/modules/item-related/item-rate/infrastructure/item-rate-data.controller.ts @@ -1,11 +1,9 @@ -import { Body, Controller, Delete, Param, Post, Put } from '@nestjs/common'; +import { Body, Controller, Get, Param, Put } from '@nestjs/common'; import { ItemRateDataOrchestrator } from '../domain/usecases/item-rate-data.orchestrator'; import { ItemRateDto } from './dto/item-rate.dto'; import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { ItemRateEntity } from '../domain/entities/item-rate.entity'; -import { BatchResult } from 'src/core/response/domain/ok-response.interface'; -import { BatchIdsDto } from 'src/core/modules/infrastructure/dto/base-batch.dto'; import { Public } from 'src/core/guards'; @ApiTags(`${MODULE_NAME.ITEM_RATE.split('-').join(' ')} - data`) diff --git a/src/modules/item-related/item-rate/item-rate.module.ts b/src/modules/item-related/item-rate/item-rate.module.ts index c0012e3..c4acfc1 100644 --- a/src/modules/item-related/item-rate/item-rate.module.ts +++ b/src/modules/item-related/item-rate/item-rate.module.ts @@ -19,13 +19,14 @@ import { ItemRateModel } from './data/models/item-rate.model'; import { SeasonPeriodHolidayHandler } from './domain/usecases/handlers/item-created.handler'; import { SeasonPeriodDataService } from 'src/modules/season-related/season-period/data/services/season-period-data.service'; import { SeasonPeriodModel } from 'src/modules/season-related/season-period/data/models/season-period.model'; +import { ItemModel } from '../item/data/models/item.model'; @Global() @Module({ imports: [ ConfigModule.forRoot(), TypeOrmModule.forFeature( - [ItemRateModel, SeasonPeriodModel], + [ItemRateModel, SeasonPeriodModel, ItemModel], CONNECTION_NAME.DEFAULT, ), CqrsModule,