|
|
|
|
@ -1,19 +1,149 @@
|
|
|
|
|
import { Injectable } from '@nestjs/common';
|
|
|
|
|
import { Injectable ,NotFoundException} from '@nestjs/common';
|
|
|
|
|
import { MailerService } from '@nest-modules/mailer';
|
|
|
|
|
import * as config from 'config';
|
|
|
|
|
|
|
|
|
|
import { TenderMasterRepository } from 'src/tables/tender-master/tender-master.repository';
|
|
|
|
|
import { PaymentMasterRepository } from 'src/tables/payment-master/payment-master.repository';
|
|
|
|
|
import { log } from 'console';
|
|
|
|
|
import * as nodemailer from 'nodemailer';
|
|
|
|
|
import { createFolders } from 'src/file-upload/file-upload.controller';
|
|
|
|
|
const mail= config.get('mail');
|
|
|
|
|
import jsPDF from 'jspdf';
|
|
|
|
|
import autoTable from 'jspdf-autotable';
|
|
|
|
|
import { promisify } from 'util';
|
|
|
|
|
|
|
|
|
|
@Injectable()
|
|
|
|
|
export class EmailService {
|
|
|
|
|
reportArray: any;
|
|
|
|
|
constructor(
|
|
|
|
|
private readonly mailerService: MailerService
|
|
|
|
|
private readonly mailerService: MailerService,
|
|
|
|
|
private tenderMasterRepository : TenderMasterRepository,
|
|
|
|
|
private paymentMasterRepository : PaymentMasterRepository
|
|
|
|
|
) { }
|
|
|
|
|
// documenation : https://www.npmjs.com/package/@nest-modules/mailer
|
|
|
|
|
|
|
|
|
|
async pdfReport(id){
|
|
|
|
|
let query= `SELECT tm.id , tm.title ,tm.send_report,tm.bid_open_date FROM tender_master tm WHERE tm.id = ${id}
|
|
|
|
|
`
|
|
|
|
|
let reportNotSend =await this.tenderMasterRepository.query(query)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let query1= `SELECT "PaymentMaster"."id" AS "id",
|
|
|
|
|
"PaymentMaster"."user_id" AS "userId",
|
|
|
|
|
tm.tender_id AS "tenderId",
|
|
|
|
|
"PaymentMaster"."trans_id" AS "transId",
|
|
|
|
|
"PaymentMaster"."final_bid_amt" AS "finalBidAmt",
|
|
|
|
|
"PaymentMaster_pcduserD"."user_name" AS "userName",
|
|
|
|
|
"PaymentMaster_pcduserD"."email" AS "email",
|
|
|
|
|
"PaymentMaster_pcduserD"."mobile_number" AS "mobileNumber"
|
|
|
|
|
FROM "payment-master" "PaymentMaster"
|
|
|
|
|
LEFT JOIN "pcduser" "PaymentMaster_pcduserD" ON"PaymentMaster_pcduserD"."user_id"="PaymentMaster"."user_id"
|
|
|
|
|
LEFT join "tender_master" "tm" on "tm"."id" = "PaymentMaster"."tender_id"
|
|
|
|
|
WHERE "PaymentMaster"."tender_id" = ${id}
|
|
|
|
|
and "PaymentMaster"."status"= 'S'
|
|
|
|
|
AND "PaymentMaster"."final_bid_amt" IS NOT NULL;`
|
|
|
|
|
let report =await this.paymentMasterRepository.query(query1);
|
|
|
|
|
|
|
|
|
|
if(report.length == 0){
|
|
|
|
|
throw new NotFoundException('Document entry not found.');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.generateReport(report,id)
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async generateReport(report,id) {
|
|
|
|
|
|
|
|
|
|
const enq = await report;
|
|
|
|
|
|
|
|
|
|
const doc = new jsPDF('landscape');
|
|
|
|
|
let headers = (['id', 'userId', 'tenderId', 'transId', 'finalBidAmt', 'userName', 'email', 'mobileNumber']);
|
|
|
|
|
|
|
|
|
|
// Prepare the data in the required format for autoTable
|
|
|
|
|
let data = [];
|
|
|
|
|
enq.forEach((item) => {
|
|
|
|
|
data.push([
|
|
|
|
|
item.id,
|
|
|
|
|
item.userId,
|
|
|
|
|
item.tenderId,
|
|
|
|
|
item.transId,
|
|
|
|
|
item.finalBidAmt,
|
|
|
|
|
item.userName,
|
|
|
|
|
item.email,
|
|
|
|
|
item.mobileNumber
|
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Create the table in the PDF document
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
autoTable(doc,{
|
|
|
|
|
startY: 1, // Adjust the starting position of the table (Y coordinate)
|
|
|
|
|
head: [headers],
|
|
|
|
|
body: data,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Save the PDF
|
|
|
|
|
const filePath: string = './uploads/Report';
|
|
|
|
|
createFolders(filePath);
|
|
|
|
|
doc.save(`${filePath}/${id}.pdf`);
|
|
|
|
|
console.log(id);
|
|
|
|
|
const pdfFileName = `${id}.pdf`;
|
|
|
|
|
const filePathReport: string = './uploads/Report/';
|
|
|
|
|
|
|
|
|
|
// Update pdfStatus
|
|
|
|
|
let pdfStatus =await this.tenderMasterRepository.findOne({where:{id:id}});
|
|
|
|
|
pdfStatus.sendReport = 'Y'
|
|
|
|
|
this.tenderMasterRepository.save(pdfStatus)
|
|
|
|
|
|
|
|
|
|
// Send email with attachment
|
|
|
|
|
const transporter = nodemailer.createTransport({
|
|
|
|
|
host: 'smtp.gmail.com',
|
|
|
|
|
port: 465,
|
|
|
|
|
secure: true,
|
|
|
|
|
auth: {
|
|
|
|
|
user: 'website.tscb@gmail.com',
|
|
|
|
|
pass: 'zubhybaneozurlvy',
|
|
|
|
|
},
|
|
|
|
|
tls: {
|
|
|
|
|
rejectUnauthorized: false,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const mailOptions = {
|
|
|
|
|
from: 'tender.tscb178@gmail.com',
|
|
|
|
|
to: 'tender.tscb178@gmail.com',
|
|
|
|
|
subject: `Generated PDF Report for ID: ${report[0].tenderId}`,
|
|
|
|
|
text: 'Attached PDF report.',
|
|
|
|
|
attachments: [
|
|
|
|
|
{
|
|
|
|
|
filename: pdfFileName,
|
|
|
|
|
path: `${filePathReport}${pdfFileName}`,
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const sendMail = promisify(transporter.sendMail.bind(transporter));
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
await sendMail(mailOptions);
|
|
|
|
|
console.log('Email sent successfully');
|
|
|
|
|
return {data : "Email sent successfully"}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Error sending email:', error);
|
|
|
|
|
return {data : "Error sending email:", error}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async sendMail(toMail:string,subject:string,bodyText: string,htmlText:string){
|
|
|
|
|
this.mailerService.sendMail({
|
|
|
|
|
to: toMail, // sender addressject: subject, // Subject line
|
|
|
|
|
to: toMail, // sender address
|
|
|
|
|
subject: subject, // Subject line
|
|
|
|
|
text: bodyText, // plaintext body
|
|
|
|
|
html: htmlText, // HTML body content
|
|
|
|
|
})
|
|
|
|
|
|