diff --git a/file.js b/file.js index 3455db9..963d939 100644 --- a/file.js +++ b/file.js @@ -45,6 +45,11 @@ async function initializeSalesforceConnection() { console.log('Salesforce connection is ready.'); } +// Escape single quotes for SOQL queries (e.g., D'Angelo -> D\'Angelo) +function escapeSoql(str) { + return str ? str.replace(/'/g, "\\'") : ''; +} + // the pdf files contain the identifying ids of the users such as 'Codice Fiscale' (CF) and we use them to attach // the page/pages to the specific account that has that id. If CFs are not available we search based on the // name an lastname of the user @@ -79,11 +84,12 @@ async function attachPdfToAccount(sfdc) { const fullName = parts.join(' '); const reversedName = [...parts.slice(1), parts[0]].join(' '); - conditions.push(`Name='${fullName}'`); + //conditions.push(`Name='${fullName}'`); if (fullName !== reversedName) { - conditions.push(`Name='${reversedName}'`); + conditions.push(`Name='${ escapeSoql(reversedName) }'`); } } + conditions.push(`Name='${ escapeSoql(rawName) }'`); } // use the soql command to search in the database @@ -192,7 +198,7 @@ async function splitExcelFile(inputFile) { }) // to store the names of the columns in columnNames - worksheet.getRow(1).eachCell((cell, cell_num) => { + worksheet.getRow(1).eachCell({ includeEmpty: true }, (cell, cell_num) => { columnNames.push(cell.value); }) @@ -200,7 +206,7 @@ async function splitExcelFile(inputFile) { for (let i = 2; i <= numRows + 1; i++) { let dataUser = {}; worksheet.getRow(i) - .eachCell((cell, cell_num) => { + .eachCell({ includeEmpty: true }, (cell, cell_num) => { const rawColumnName = columnNames[cell_num - 1] || `column_${cell_num}`; // 1. Trim whitespace and replace spaces with underscores @@ -273,7 +279,25 @@ async function splitPDF(numRows, inputFile) { } } +// cleans up temporary files from OS temp directory +function cleanUp() { + tempFilePath.forEach((file) => { + try { + if (fs.existsSync(file)) { + fs.unlinkSync(file); + } + } + catch (err) { + console.log(`Failed in deleting the temporary file ${ file }: `, err); + } + }) +} + async function main() { + if (!excelFile || !pdfFile) { + console.error('Error: Please provide both Excel and PDF paths.\nUsage: node script.js '); + process.exit(1); + } const result = await splitExcelFile(excelFile); await splitPDF(result, pdfFile); const rl = readline.createInterface({ input, output }); @@ -299,6 +323,7 @@ async function main() { } finally { rl.close(); + cleanUp(); } }