UNPKG

efficy-enterprise-api

Version:

The Efficy Enterprise API is developed for server-side usage in a Node.js environment (e.g. for integrations) and also bundled for usage inside an Efficy browser session for client-side JSON RPC requests.

283 lines (240 loc) 10 kB
//@ts-check global.applicationName = "efficy-enterprise-api"; import fs from 'fs'; import { CrmEnv, CrmRpc} from "./lib/index.mjs"; function logger(msg, reqLog) { console.log(msg); } /** * Processed 200 items with 8 threads in 21.463 seconds * Processed 200 items with 6 threads in 20.623 seconds * Processed 200 items with 4 threads in 21.44 seconds * Processed 200 items with 3 threads in 23.563 seconds * Processed 200 items with 2 threads in 25.661 seconds * Processed 200 items with 1 threads in 42.376 seconds */ async function multiThreadedUnitTest() { const itemCount = 200; const stackList = Array.from(Array(itemCount).keys()).map(i => {return {id: i}}) // [{id: 0}, {id: 1}, {id: 2}, ... {id: itemCount - 1}] const threads = 3; const parallelSession = async function(threadId) { var item; const crmEnv = new CrmEnv({ "url": "http://efficy120/", "customer": "efficy120", "apiKey": "86E353284C0C4A848F7ADEA13589C8B6" }); const crm = new CrmRpc(crmEnv); item = stackList.pop(); // LIFO (last in first out) while (item !== undefined) { const task = crm.openEditObject("acti", 0); task.updateField("SUBJECT", `multiThreadedUnitTest ${item.id} [${threadId}]`); task.updateFields({ "PLANNED": "0" }) task.insertDetail("Comp", 1133); task.closingCommit(); await crm.executeBatch(); console.log(`${item.id} - ${crm.sessionId} - acti/${task.key}`); item = stackList.pop(); } crm.logoff(); await crm.executeBatch(); } const parallelSessions = Array.from(Array(threads).keys()).map(threadId => { return parallelSession(threadId); // Processed with 5 threads in 10.915 seconds }) const dStart = new Date(); await Promise.all(parallelSessions); const dEnd = new Date(); console.log(`Processed ${itemCount} items with ${threads} threads in ${(dEnd.getTime() - dStart.getTime()) / 1000} seconds`) } async function singleThreadUnitTest() { const crmEnv = new CrmEnv({ "url": "http://efficy120/", "customer": "efficy120", "apiKey": "86E353284C0C4A848F7ADEA13589C8B6", "logOff": false, "user": "", "pwd": "" }); const crm = new CrmRpc(crmEnv, logger); const compCategories = crm.getCategoryCollection("comp"); const morningMeetings = crm.consultManyEx("Acti", ["PLANNED", "D_BEGIN"], ["1", "2022-03-14 09:00:00"], "D_BEGIN"); const settings = crm.getSystemSettings(); const workingPeriodFrom = crm.getSetting("user", "WorkingPeriodFrom"); const workingPeriodFromFloat = crm.getSetting("user", "WorkingPeriodFrom", false); const compRecents = crm.consultRecent("Comp"); const compRecentsEx = crm.consultRecent("Comp", ["CITY", "COUNTRY"]); const compFavorites = crm.consultFavorites("Comp"); const userList = crm.getUserList(); const sessionProperties = { currentDatabaseAlias: crm.currentDatabaseAlias, currentDatabaseTimezone: crm.currentDatabaseTimezone, currentLicenseName: crm.currentLicenseName, currentUserFullName: crm.currentUserFullName, currentUserGroups: crm.currentUserGroups, currentUserId: crm.currentUserId, currentUserCode: crm.currentUserCode, currentUserTimezone: crm.currentUserTimezone } await crm.executeBatch(); Object.keys(sessionProperties).forEach(key => { console.log(`${key} = ${sessionProperties[key].result}`) }); // https://nodejs.org/api/buffer.html#buffer const path = "Efficy - Invoicing Module.pdf"; const filePath = "C:/Efficy/Temp/VS2005_Release_Notes.pdf"; const base64String = fs.readFileSync(filePath, { flag: 'r' }).toString('base64'); const attach = crm.openEditObject("docu", 229); const dsAttach = attach.getMasterDataSet(); const dsAttachInvo = attach.getCategoryDataSet("DOCU$INVOICING"); const files = attach.getDetailDataSet("file"); await crm.executeBatch(); const document = crm.openEditObject("docu", 0); document.insertAttachment(crm.constants.file_type.embedded, "dummy"); await crm.executeBatch(); const dsFiles = document.getDetailDataSet("file", "", true); await crm.executeBatch(); const file = files.item; // @ts-ignore const attachment = await attach.getAttachment(file.K_FILE, file.VERSION); await crm.executeBatch(); const exportPath = "C:/Efficy/Temp/efficy-enterprise-unittest_exported.pdf" fs.writeFileSync(exportPath, Buffer.from(attachment.base64Stream, 'base64')); attach.updateField("NAME", "File with max 7 attachments"); attach.insertAttachment(crm.constants.file_type.embedded, path); attach.updateAttachment(0, base64String); await crm.ws.cleanupFiles(attach, "", 7); await crm.ws.cleanupFiles(attach, `COMMENT like '%template%'`, 0); attach.closingCommit(); await crm.executeBatch(); const comp = crm.openConsultObject("comp", 2); const dsComp = comp.getMasterDataSet(); const dsCompAddress = comp.getCategoryDataSet("COMP$ADDRESS"); await crm.executeBatch(); const companyNames = [comp.data.master.NAME, comp.data.category["COMP$ADDRESS"].NAME]; const compCopy = crm.getConsultObject(comp.consulthandle, "Comp"); const linkedContacts = compCopy.getDetailDataSet("cont"); compCopy.closeContext(); const contComp = crm.openEditRelationObject("comp", "cont", 2, 5); contComp.updateFields({ "JOBTITLE": "CrmRpc tester" }) contComp.closingCommit(); const contCont = crm.openEditRelationObject("cont", "cont", 5, 6); contCont.updateField("RELATION", 1); contCont.updateReciprocityField("RELATION", 2); contCont.commitChanges(); const dsContCont = contCont.getMasterDataSet(); const dsContCont1 = contCont.getMasterDataSet(1); await crm.executeBatch(); if (!dsContCont.item["RELATION"] || dsContCont.item["RELATION"] === dsContCont1.item["RELATION"]) throw Error("Not OK"); contCont.closingCommit(); const oppoProd = crm.openEditRelationObject("oppo", "prod", 2, 3, 339180511); oppoProd.updateField("PRICE", -3.1415); oppoProd.closingCommit(); const docu = crm.openEditObject("docu", 0); docu.updateField("NAME", "Jan"); docu.insertDetail("Comp", 2); docu.insertDetail("Cont", 44395, true, true); docu.commitChanges(); docu.activateCategory("DOCU$INVOICING"); docu.updateCategoryFields("DOCU$INVOICING", { "D_INVOICE":"2021-01-08T00:00:00", "COMMUNICATION": "Hello World!" }); docu.updateCategoryField("DOCU$INVOICING", "PRE_PAID", 123.456) docu.clearDetail("Comp"); docu.insertDetail("Comp", 4); //docu.insertDetail("Cont", 50512, false); docu.insertDetail("Prod", 4); docu.updateDetail("Prod", 0, { QUANTITY: 5 }); docu.setUsers([169, 170], true); docu.setUserSecurity(99999002, 271); docu.setReference(99999001); docu.commitChanges(); docu.closeContext(); await crm.executeBatch(); crm.deleteEntity("docu", []); crm.deleteEntity("docu", docu.key); const task = crm.openEditObject("acti", 0); task.updateField("SUBJECT", "Demo Task"); task.updateFields({ "MEMO": "Hello", "PLANNED": "0" }) task.insertDetail("Comp", 2); task.closingCommit(); const appo = crm.openEditObject("acti", 0); appo.updateField("SUBJECT", "appoCopy"); appo.updateFields({ "PLANNED": "1" }) await crm.executeBatch(); appo.insertDetail("Comp", 2); const appoCopy = crm.getEditObject(appo.edithandle); appoCopy.insertDetail("Comp", 1129); appoCopy.closingCommit(); const duplicatedTask = crm.openEditObject("Acti", 0); duplicatedTask.getMasterDataSet(); duplicatedTask.getDetailDataSet("Cont"); duplicatedTask.copyFromExisting(3501); await crm.executeBatch(); duplicatedTask.updateField("SUBJECT", "Copy of " + duplicatedTask.data.master["SUBJECT"]); duplicatedTask.closingCommit(); const tags = crm.executeDatabaseQuery(99990034); // query "Standard: Top company tags" const compSearch = crm.search("comp", "SEARCHFAST", "Efficy"); const contactsByEmail = crm.searchContactsByEmail(["john.doe@efficy.com", "john.doe@outlook.com"]); const contactsByPhone = crm.searchContactsByPhone("+32 470 00 00 00"); const contDupls = crm.executeSystemQuery(4, 1, [11000,2]); // System query "Own Duplicate List" const appos = crm.executeSqlQuery("Select * from ACTIONS where PLANNED=:p1 and DONE=:p2", ["1", "0"], true, 2); await crm.executeBatch(); crm.logoff(); await crm.executeBatch(); console.log(JSON.stringify(compCategories.items)); console.log(JSON.stringify(morningMeetings.items)); console.log(JSON.stringify(attach)); console.log(JSON.stringify(dsAttach.item)); console.log(JSON.stringify(dsAttachInvo.item)); console.log(JSON.stringify(comp)); console.log(JSON.stringify(dsComp.item)); console.log(JSON.stringify(dsCompAddress.item)); console.log(dsContCont.item["R_RELATION"]); console.log(dsContCont1.item["R_RELATION"]); console.log(JSON.stringify(docu)); console.log(JSON.stringify(task)); console.log(JSON.stringify(appo)); console.log(JSON.stringify(tags.items)); console.log(JSON.stringify(compSearch.items)); console.log(JSON.stringify(contactsByEmail.items)); console.log(JSON.stringify(contactsByPhone.items)); console.log(JSON.stringify(contDupls.items)); console.log(JSON.stringify(appos.items)); console.log(JSON.stringify(compRecents.items)); console.log(JSON.stringify(compRecentsEx.items)); console.log(JSON.stringify(compFavorites.items)); console.log(JSON.stringify(userList.items)); console.log(settings.map.get("ShortDateFormat")); console.log(workingPeriodFrom.result); console.log(workingPeriodFromFloat.result); console.log('[PASS] all tests pass'); } async function useDotEnv() { const crmEnv = new CrmEnv(); const crm = new CrmRpc(crmEnv, logger); const compSearch = crm.search("comp", "SEARCHFAST", "Efficy"); crm.logoff(); await crm.executeBatch(); console.log(compSearch.items); console.log('[PASS] all tests pass'); } const main = async function() { //await multiThreadedUnitTest(); await singleThreadUnitTest() //await useDotEnv(); }; // @ts-ignore await main();