igcrmapi/src/quotes/quotes.service.ts

151 lines
4.0 KiB
TypeScript

import { Injectable, BadRequestException, NotFoundException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { CreateQuoteDto } from './dto/create-quote.dto';
import { UpdateQuoteDto } from './dto/update-quote.dto';
import { WhatsappService } from '../whatsapp/whatsapp.service';
@Injectable()
export class QuotesService {
constructor(
private readonly prisma: PrismaService,
private readonly whatsappService: WhatsappService
) { }
async create(createQuoteDto: CreateQuoteDto) {
const quote = await this.prisma.quote.create({
data: {
...createQuoteDto,
items: JSON.stringify(createQuoteDto.items)
} as any,
include: {
opportunity: {
include: {
client: true,
},
},
enquiry: {
include: {
client: true,
},
},
},
});
try {
const client = quote.opportunity?.client || quote.enquiry?.client;
console.log('Quote created. Attempting to send WhatsApp to client:', client?.name, 'Phone:', client?.phone);
if (client) {
const baseUrl = process.env.API_BASE_URL || 'http://localhost:3000';
const mediaUrl = quote.pdfUrl ? `${baseUrl}${quote.pdfUrl}` : undefined;
console.log('Calling whatsappService.sendQuoteCreation with mediaUrl:', mediaUrl);
await this.whatsappService.sendQuoteCreation(
client.phone,
client.name,
quote.totalAmount.toString(),
mediaUrl
);
}
} catch (err) {
console.error('Failed to send quote creation WhatsApp:', err.message);
}
return quote;
}
findAll() {
return this.prisma.quote.findMany({
include: {
opportunity: {
include: {
client: true,
},
},
enquiry: {
include: {
client: true,
},
},
user: true,
},
});
}
findOne(id: string) {
return this.prisma.quote.findUnique({
where: { id },
include: {
opportunity: {
include: {
client: true,
},
},
enquiry: {
include: {
client: true,
},
},
user: true,
},
});
}
update(id: string, updateQuoteDto: UpdateQuoteDto) {
const data = { ...updateQuoteDto } as any;
if (updateQuoteDto.items) {
data.items = JSON.stringify(updateQuoteDto.items);
}
return this.prisma.quote.update({
where: { id },
data,
});
}
remove(id: string) {
return this.prisma.quote.delete({
where: { id },
});
}
async send(id: string, type: 'whatsapp' | 'email') {
const quote = await this.findOne(id);
if (!quote) {
throw new NotFoundException(`Quote with ID ${id} not found`);
}
const client = quote.opportunity?.client || quote.enquiry?.client;
if (!client) {
throw new BadRequestException('This quote is not linked to a valid client');
}
if (!client.phone) {
throw new BadRequestException('The client associated with this quote has no phone number');
}
const baseUrl = process.env.API_BASE_URL || 'http://localhost:3000';
const mediaUrl = quote.pdfUrl ? `${baseUrl}${quote.pdfUrl}` : undefined;
if (type === 'whatsapp') {
const fs = require('fs');
fs.appendFileSync('service_log.txt', `[${new Date().toISOString()}] Manual send triggered for ID: ${id}\n`);
console.log('Manually sending quote via WhatsApp. ID:', id);
const result = await this.whatsappService.sendQuote(
client.phone,
client.name,
quote.totalAmount.toString(),
mediaUrl
);
console.log('WhatsApp send result:', result);
if (result && !(result as any).success) {
throw new BadRequestException((result as any).error || 'Failed to send WhatsApp message');
}
return result;
}
return { success: true };
}
}