// ============================================================ // Shared Owner Service fuer Contact, Company, Deal // ============================================================ import { Injectable, NotFoundException } from '@nestjs/common'; import { CrmPrismaService } from '../prisma/crm-prisma.service'; import { AddOwnerDto } from '../common/dto/owner.dto'; @Injectable() export class OwnersService { constructor(private readonly prisma: CrmPrismaService) {} // -------------------------------------------------------- // Contact Owners // -------------------------------------------------------- async addContactOwner(tenantId: string, contactId: string, dto: AddOwnerDto) { // Contact existiert + gehoert zum Tenant const contact = await this.prisma.contact.findFirst({ where: { id: contactId, tenantId }, }); if (!contact) { throw new NotFoundException('Kontakt nicht gefunden'); } // Upsert: Falls Owner bereits existiert, Rolle aktualisieren return this.prisma.contactOwner.upsert({ where: { contactId_userId: { contactId, userId: dto.userId }, }, create: { tenantId, contactId, userId: dto.userId, role: dto.role ?? 'OWNER', }, update: { role: dto.role ?? 'OWNER', }, }); } async removeContactOwner(tenantId: string, contactId: string, userId: string) { // Contact existiert + gehoert zum Tenant const contact = await this.prisma.contact.findFirst({ where: { id: contactId, tenantId }, }); if (!contact) { throw new NotFoundException('Kontakt nicht gefunden'); } // Owner suchen const owner = await this.prisma.contactOwner.findUnique({ where: { contactId_userId: { contactId, userId }, }, }); if (!owner) { throw new NotFoundException('Owner nicht gefunden'); } return this.prisma.contactOwner.delete({ where: { id: owner.id }, }); } // -------------------------------------------------------- // Company Owners // -------------------------------------------------------- async addCompanyOwner(tenantId: string, companyId: string, dto: AddOwnerDto) { const company = await this.prisma.company.findFirst({ where: { id: companyId, tenantId }, }); if (!company) { throw new NotFoundException('Unternehmen nicht gefunden'); } return this.prisma.companyOwner.upsert({ where: { companyId_userId: { companyId, userId: dto.userId }, }, create: { tenantId, companyId, userId: dto.userId, role: dto.role ?? 'OWNER', }, update: { role: dto.role ?? 'OWNER', }, }); } async removeCompanyOwner(tenantId: string, companyId: string, userId: string) { const company = await this.prisma.company.findFirst({ where: { id: companyId, tenantId }, }); if (!company) { throw new NotFoundException('Unternehmen nicht gefunden'); } const owner = await this.prisma.companyOwner.findUnique({ where: { companyId_userId: { companyId, userId }, }, }); if (!owner) { throw new NotFoundException('Owner nicht gefunden'); } return this.prisma.companyOwner.delete({ where: { id: owner.id }, }); } // -------------------------------------------------------- // Deal Owners // -------------------------------------------------------- async addDealOwner(tenantId: string, dealId: string, dto: AddOwnerDto) { const deal = await this.prisma.deal.findFirst({ where: { id: dealId, tenantId }, }); if (!deal) { throw new NotFoundException('Vorgang nicht gefunden'); } return this.prisma.dealOwner.upsert({ where: { dealId_userId: { dealId, userId: dto.userId }, }, create: { tenantId, dealId, userId: dto.userId, role: dto.role ?? 'OWNER', }, update: { role: dto.role ?? 'OWNER', }, }); } async removeDealOwner(tenantId: string, dealId: string, userId: string) { const deal = await this.prisma.deal.findFirst({ where: { id: dealId, tenantId }, }); if (!deal) { throw new NotFoundException('Vorgang nicht gefunden'); } const owner = await this.prisma.dealOwner.findUnique({ where: { dealId_userId: { dealId, userId }, }, }); if (!owner) { throw new NotFoundException('Owner nicht gefunden'); } return this.prisma.dealOwner.delete({ where: { id: owner.id }, }); } }