1+ import config from 'config' ;
12import { v4 as uuidv4 } from 'uuid' ;
23
34import { transactionWrapper } from '../db/utils/transactionWrapper.ts' ;
@@ -10,6 +11,7 @@ import {
1011import { createActivity , deleteActivity } from '../services/activity.ts' ;
1112import { createActivityContact , listActivityContacts } from '../services/activityContact.ts' ;
1213import { searchContacts , upsertContacts } from '../services/contact.ts' ;
14+ import { email } from '../services/email.ts' ;
1315import {
1416 createEnquiry ,
1517 deleteEnquiry ,
@@ -19,12 +21,14 @@ import {
1921 searchEnquiries ,
2022 updateEnquiry
2123} from '../services/enquiry.ts' ;
24+ import { getProjectByActivityId } from '../services/project.ts' ;
2225import {
2326 ActivityContactRole ,
2427 ApplicationStatus ,
2528 EnquirySubmittedMethod ,
2629 SubmissionType
2730} from '../utils/enums/projectCommon.ts' ;
31+ import { confirmationTemplateEnquiry } from '../utils/templates' ;
2832import { getCurrentUsername , isTruthy } from '../utils/utils.ts' ;
2933
3034import type { Request , Response } from 'express' ;
@@ -110,9 +114,69 @@ export const createEnquiryController = async (req: Request<never, never, Enquiry
110114 return { ...data , contact : contactResponse [ 0 ] } ;
111115 } ) ;
112116
117+ await emailEnquiryConfirmation ( result , req . currentContext . initiative ! , req . body . basic ?. relatedActivityId ) ;
113118 res . status ( 201 ) . json ( result ) ;
114119} ;
115120
121+ async function emailEnquiryConfirmation (
122+ enquiryWithContact : Enquiry & { contact : Contact } ,
123+ initiative : string ,
124+ relatedActivityId ?: string
125+ ) {
126+ await transactionWrapper < void > ( async ( tx : PrismaTransactionClient ) => {
127+ const configCC = config . get < string > ( 'server.ches.submission.cc' ) ;
128+
129+ let permitDescription = '' ;
130+ let enquiryDescription : string = enquiryWithContact . enquiryDescription || '' ;
131+ let firstTwoSentences : string ;
132+
133+ // If has permit description convert \n to <br>
134+ if ( enquiryDescription . includes ( 'Tracking ID:' ) ) {
135+ const descriptionSplit = enquiryDescription . split ( '\n\n' ) ;
136+ permitDescription = descriptionSplit [ 0 ] ?. replace ( / \n / g, '<br>' ) + '<br><br>' ;
137+ enquiryDescription = descriptionSplit . slice ( 1 , descriptionSplit . length ) . join ( ' ' ) ;
138+ }
139+
140+ // Get the first two sentences of the enquiry description using proper sentence segmentation
141+ // If there are more than two sentences in enquiryDescription, add '..' to the end
142+ const segmenter = new Intl . Segmenter ( 'en' , { granularity : 'sentence' } ) ;
143+ const segments = Array . from ( segmenter . segment ( enquiryDescription ) ) ;
144+ const sentences = segments . map ( ( s ) => s . segment . trim ( ) ) . filter ( ( sentence : string ) => sentence . length > 0 ) ;
145+
146+ firstTwoSentences = sentences . slice ( 0 , 2 ) . join ( ' ' ) ;
147+ if ( sentences . length > 2 ) {
148+ firstTwoSentences = firstTwoSentences . concat ( '..' ) ;
149+ }
150+
151+ if ( permitDescription ) firstTwoSentences = permitDescription + firstTwoSentences ;
152+
153+ const projectId = relatedActivityId ? ( await getProjectByActivityId ( tx , relatedActivityId ) ) ?. projectId : undefined ;
154+
155+ const body = confirmationTemplateEnquiry ( {
156+ contactName :
157+ enquiryWithContact . contact ?. firstName && enquiryWithContact . contact ?. lastName
158+ ? `${ enquiryWithContact . contact ?. firstName } ${ enquiryWithContact . contact ?. lastName } `
159+ : '' ,
160+ activityId : enquiryWithContact . activityId ,
161+ enquiryDescription : firstTwoSentences . trim ( ) ,
162+ enquiryId : enquiryWithContact . enquiryId ,
163+ projectId : projectId ,
164+ initiative : initiative . toLowerCase ( )
165+ } ) ;
166+
167+ const emailData = {
168+ from : configCC ,
169+ to : [ enquiryWithContact . contact . email ! ] ,
170+ cc : [ configCC ] ,
171+ subject : 'Confirmation of Enquiry Submission' ,
172+ bodyType : 'html' ,
173+ body : body
174+ } ;
175+
176+ await email ( emailData ) ;
177+ } ) ;
178+ }
179+
116180export const deleteEnquiryController = async ( req : Request < { enquiryId : string } > , res : Response ) => {
117181 await transactionWrapper < void > ( async ( tx : PrismaTransactionClient ) => {
118182 const enquiry = await getEnquiry ( tx , req . params . enquiryId ) ;
0 commit comments