import { BusinessActivitySelect } from '@/generated/prisma/models' import { PrismaService } from '@/prisma/prisma.service' import { Injectable } from '@nestjs/common' import { ResponseMapper } from 'common/response/response-mapper' @Injectable() export class BusinessActivitiesService { constructor(private readonly prisma: PrismaService) {} defaultSelect: BusinessActivitySelect = { id: true, name: true, economic_code: true, created_at: true, guild: { select: { id: true, code: true, name: true, }, }, complexes: { select: { _count: { select: { pos_list: true, }, }, }, }, license_activation: { select: { id: true, starts_at: true, expires_at: true, license: { select: { accounts_limit: true, _count: { select: { account_allocations: true, }, }, }, }, }, }, } private readonly prepareBusinessActivityResponse = (businessActivity: any) => { const { license_activation, complexes, ...rest } = businessActivity const { license, ...license_activation_rest } = license_activation const { accounts_limit, _count } = license return { ...rest, license_info: { ...license_activation_rest, accounts_limit: accounts_limit + _count.account_allocations, allocated_account_count: complexes.reduce( (acc: number, complex: any) => acc + complex._count.pos_list, 0, ), }, } } async findAll(consumer_id: string) { const businessActivities = await this.prisma.businessActivity.findMany({ where: { consumer_id, }, select: this.defaultSelect, }) return ResponseMapper.list( businessActivities.map(this.prepareBusinessActivityResponse), ) } async findOne(consumer_id: string, id: string) { const businessActivity = await this.prisma.businessActivity.findUniqueOrThrow({ where: { consumer_id, id }, select: this.defaultSelect, }) return ResponseMapper.single(this.prepareBusinessActivityResponse(businessActivity)) } async update(consumer_id: string, id: string, data: any) { const businessActivity = await this.prisma.businessActivity.update({ where: { id, consumer_id }, data, select: this.defaultSelect, }) return ResponseMapper.update(this.prepareBusinessActivityResponse(businessActivity)) } }