151 lines
4.0 KiB
TypeScript
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 };
|
|
}
|
|
}
|