149 lines
5.5 KiB
TypeScript
149 lines
5.5 KiB
TypeScript
import { getInterestById, updateInterest } from '~/server/utils/nocodb';
|
|
import { getDocumesoDocumentByExternalId, checkDocumentSignatureStatus } from '~/server/utils/documeso';
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const xTagHeader = getRequestHeader(event, "x-tag");
|
|
|
|
console.log('[EOI Delete Generated] Request received with x-tag:', xTagHeader);
|
|
|
|
if (!xTagHeader || (xTagHeader !== "094ut234" && xTagHeader !== "pjnvü1230")) {
|
|
console.error('[EOI Delete Generated] Authentication failed - invalid x-tag');
|
|
throw createError({ statusCode: 401, statusMessage: "unauthenticated" });
|
|
}
|
|
|
|
try {
|
|
const body = await readBody(event);
|
|
const { interestId } = body;
|
|
|
|
console.log('[EOI Delete Generated] Interest ID:', interestId);
|
|
|
|
if (!interestId) {
|
|
console.error('[EOI Delete Generated] No interest ID provided');
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: 'Interest ID is required',
|
|
});
|
|
}
|
|
|
|
// Get current interest data
|
|
const interest = await getInterestById(interestId);
|
|
if (!interest) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
statusMessage: 'Interest not found',
|
|
});
|
|
}
|
|
|
|
// Check if there are signature links (indicating a generated document)
|
|
const hasSignatureLinks = !!(interest['Signature Link Client'] ||
|
|
interest['Signature Link CC'] ||
|
|
interest['Signature Link Developer']);
|
|
|
|
if (!hasSignatureLinks) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: 'No generated EOI document found for this interest',
|
|
});
|
|
}
|
|
|
|
// Check signature status to prevent deletion of fully signed documents
|
|
const externalId = `loi-${interestId}`;
|
|
let documentId: number | null = null;
|
|
|
|
try {
|
|
const document = await getDocumesoDocumentByExternalId(externalId);
|
|
if (document) {
|
|
documentId = document.id;
|
|
|
|
// Check if all parties have signed
|
|
const signatureStatus = await checkDocumentSignatureStatus(documentId);
|
|
|
|
if (signatureStatus.allSigned) {
|
|
throw createError({
|
|
statusCode: 403,
|
|
statusMessage: 'Cannot delete: All parties have already signed this document',
|
|
});
|
|
}
|
|
|
|
console.log('[EOI Delete Generated] Document found in Documenso:', documentId);
|
|
console.log('[EOI Delete Generated] Signature status:', {
|
|
allSigned: signatureStatus.allSigned,
|
|
clientSigned: signatureStatus.clientSigned,
|
|
signedCount: signatureStatus.signedRecipients.length,
|
|
unsignedCount: signatureStatus.unsignedRecipients.length
|
|
});
|
|
}
|
|
} catch (error: any) {
|
|
console.warn('[EOI Delete Generated] Could not find or check Documenso document:', error.message);
|
|
// Continue with deletion even if Documenso document not found
|
|
}
|
|
|
|
// Delete document from Documenso if it exists
|
|
if (documentId) {
|
|
try {
|
|
const documensoApiKey = process.env.NUXT_DOCUMENSO_API_KEY;
|
|
const documensoBaseUrl = process.env.NUXT_DOCUMENSO_BASE_URL;
|
|
|
|
if (!documensoApiKey || !documensoBaseUrl) {
|
|
console.error('[EOI Delete Generated] Documenso configuration missing');
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: 'Documenso configuration missing',
|
|
});
|
|
}
|
|
|
|
console.log('[EOI Delete Generated] Deleting document from Documenso:', documentId);
|
|
|
|
const deleteResponse = await fetch(`${documensoBaseUrl}/api/v1/documents/${documentId}`, {
|
|
method: 'DELETE',
|
|
headers: {
|
|
'Authorization': `Bearer ${documensoApiKey}`,
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
|
|
if (!deleteResponse.ok) {
|
|
const errorText = await deleteResponse.text();
|
|
console.error('[EOI Delete Generated] Failed to delete from Documenso:', errorText);
|
|
throw new Error(`Failed to delete document from Documenso: ${deleteResponse.statusText}`);
|
|
}
|
|
|
|
console.log('[EOI Delete Generated] Successfully deleted document from Documenso');
|
|
} catch (error: any) {
|
|
console.error('[EOI Delete Generated] Error deleting from Documenso:', error);
|
|
// Don't throw here - continue with database cleanup even if Documenso deletion fails
|
|
}
|
|
}
|
|
|
|
// Reset interest fields
|
|
const updateData = {
|
|
'EOI Status': 'Awaiting Further Details' as const,
|
|
'Sales Process Level': 'Specific Qualified Interest' as const,
|
|
'EOI Time Sent': undefined,
|
|
'Signature Link Client': undefined,
|
|
'Signature Link CC': undefined,
|
|
'Signature Link Developer': undefined,
|
|
'Documeso ID': undefined,
|
|
'reminder_enabled': false
|
|
};
|
|
|
|
console.log('[EOI Delete Generated] Resetting interest fields');
|
|
|
|
// Update the interest
|
|
await updateInterest(interestId, updateData);
|
|
|
|
console.log('[EOI Delete Generated] Delete completed successfully');
|
|
return {
|
|
success: true,
|
|
message: 'Generated EOI document deleted successfully',
|
|
};
|
|
} catch (error: any) {
|
|
console.error('[EOI Delete Generated] Failed to delete generated EOI document:', error);
|
|
console.error('[EOI Delete Generated] Error stack:', error.stack);
|
|
throw createError({
|
|
statusCode: error.statusCode || 500,
|
|
statusMessage: error.statusMessage || error.message || 'Failed to delete generated EOI document',
|
|
});
|
|
}
|
|
});
|