SuperOffice CRM Professionals

Experienced experts in SuperOffice CRM - those primarily responsible for the setup, configuration, maintenance of SuperOffice in an organization, as well as those responsible for the implementation of applications or integrations, or provide consultancy services as to how an integration should be implemented using current industry standards.

Technical blog posts

Spelling in code

Spelling mistakes always hit you when you're not expecting it. The harsh reality is that people will judge you on it. Nothing can make you or your company lose credibility more quickly. But I write code, not literary fiction... Yet you put your writing in front of other developers. Daily.     A typo in a code comment might trip up your co-worker reviewing your code. Or perhaps it goes undetected for years until they attempt to refactor or extend the code - after you left the company. Meanwhile, the comment is propagated to a public API reference where it can affect your company and trip up an unknown number of developers. Did someone say support case? OK. But let's say the typo was not in a comment, but actual code like a method name, property, or enum? Thanks to your IDE, IntelliSense will propagate your initial mistake like wildfire throughout the code-base. Awesome! Never, ever feed the Mogwai after midnight.     As with all bugs: the earlier you catch it, the cheaper it is to fix it. Who does not like bugs in production? The thrill of patches and hot-fixes.  But do you realize that once a misspelling is in the released API you have to live with it or break compatibility? Auch!   SuperOffice.CRM.ArchiveLists.AppointmentExtenderBase.ColumnRecurrenceRuleId SuperOffice.CRM.ArchiveLists.AppointmentExtenderBase._colRecurrencId The solution Slow down, read the actual words on the screen, and not what your autopilot concludes is there. Use a code spell checker. (Both for creating and reviewing.) Get a second pair of eyes. Own your oops'es and do the non-code-related PR change. Options VS Code: Code Spell Checker (cspell) Visual Studio: VS2017andLater | VS2022andLater (NHunSpell) Your milage might vary but I'm sure there is a spell checker match for you too.   Personally, I go the VS Code route with Code Spell Checker plus Grammarly. For SuperOffice Docs , we have a shared dictionary in .vscode/settings.json in each repo. You can check it out on GitHub .     (The covfefe level in my bloodstream is low. Please excuse any typos.)

Bergfrid Skaara Dias
13-01-2022
thumb_up3 mode_comment0

New Technical Forums

Hello fellow community members! So you might be wondering what happened to the forum structure, and I'd like to address that here and now. First and foremost, I apologize for any inconvenience it might have on your old bookmarks and/or saved favorites. It was decided to focus on the future and not dwell on the past. Search hasn't changed that much, and as long as you still have the same ending URL in those favorites, they will make good search terms to rediscover where those posts now reside.  That said, let me explain the mapping rules that went into the migration. Here is a list of the old forums... Technical Forums:---------------------------- Customer Service:       CRM Windows Application:   CRM Web Application:       eMarketing Application:   PocketCRM Application:    Online Operations Status: Hidden eMarketing:       Developer Forums:---------------------------- NS Core:                   NS Services:               Customer Service:          CRM Windows Application:   CRM Web Application:       CRM Online Development:    Continuous Database:       Developer Announcements:   There was quite a bit of overlap, and over time it became obvious that the club concept, and knowing and where to ask a question, could easily be confusing and perhaps even overwhelming. With the inevitable merger of the clubs, and having nearly identical listing of forums in each club, it would have been easy to just combine the two into a single similar grouping. However, even then the choices to know where to post a question could still be confusing. I mean, isn't the service client also a web application? Isn't emarketing part of the service client? So, in an attempt to simplify, the decision was made to consolidate the number of options. Thereby decreasing any anxiety and increasing the effectiveness and intuitiveness of using the technical forums. General Forums  - Technical Announcements: consolidated both technical and developer related announcements. API Forums  - Client library and tools: NetServer Core, Continuous Database  - Online development and web services: NetServer Services, Online Development  - Service and CRM Script: consolidate Tech and Dev Customer Service, eMarketing Technical Product Forums  - CRM Web Application: consolidate Tech and Dev CRM Web Application  - CRM Windows Application: consolidate Tech and Dev CRM Web Application  - CRM Mobile Application: migration of PocketCRM Application   I also have to mention that a lot of the posts from the old Technical Club were migrated to the new User Admin forums . We foresee questions pertaining to what you do in the clients going to the User Admin forums . The Technical forums are reserved for network/system administrators setting up and maintaining SuperOffice for onsite installations, as well building integrations and customizations using the API. All of the previous technical documentation now resides on SuperOffice Docs . Let's know if you have any trouble finding information on docs by submitting feedback . I get it. No one likes their cheese moved. However, I believe this is the right decision moving forward. I hope you now have a better understanding of the motivation behind it, and eventually agree.   

Tony Yates
16-12-2021
thumb_up2 mode_comment0

Announcing docs.superoffice.com

Introducing docs.superoffice.com  Today we're announcing the release of our new documentation service.   Why docs.superoffice.com?  It doesn't matter how good SuperOffice is, if the documentation is no good, people will not use it. Even worse, if the documentation is bad, integrations will be inefficient and not leverage our platform as intended.  Our old content was fragmented and had inconsistent branding, limited searchability, and limited community contribution capabilities. We have consolidated content across 2 community clubs, 6 stand-alone static websites, and several blog and forum posts - all moved to github.com as a content repository and community tool.  The new site is the result of adopting a paradigm shift called Docs as Code , which makes our documentation more sustainable and future-proof. We tap into standardized processes for software engineers, while being open and transparent - because  relationships matter .  Key features  The site is both the shell that makes up the destination - where like-minded people go to read about all things technical pertaining to SuperOffice - and the content the website contains. We aim to provide all SuperOffice technical content in one place with a standardized look and feel.  Friendly URLs  The site URLs are structured to be intuitive . That means, for example, when you want to know more information about sales, you can just type 'sale' in the address bar, i.e. docs.superoffice.com/sale, and you will see all information pertaining to sales. If you want to discover more information about documents, you can just type 'document' in the URL, i.e. docs.superoffice.com/document to learn more about documents.  Minimalist design  No muss no fuss! No tonka toy colors, no cartoon figures. Just green and clean ! We believe less noise and more information is better than trying to make it look slick and fancy.  Content and site navigation  One key area of investment based on feedback was improvements in site navigation, information architecture, and content organization. For example, we've combined everything from the community technical and developer documentation into a  single hub where you can easily discover relevant information pertaining to the topics that interest you. For example, the following API documentation home page demonstrates our approach at simplying navigation to the various topics within that area. We follow that same pattern throughout the main areas of SuperOffice. We have raised the existing content into a completely new structure and are constantly revising it. Articles are generally shorter and more focused, being either conceptual, how-to guides, reference, or tutorials. Of course, we can't fix 30 years of documentation overnight. But we're agile and will deliver incremental updates along with new content in the coming months and years. You can even monitor our progress on  Github , and help keep up accountable.  Discovery and search  Instead of multiple disconnected sites with deep content trees, docs.superoffice.com has a solid root you can start exploring from, be it our high-lighted content , based on your role , or popular areas of interest . Our broad and shallow tree will take you to what you're looking for in fewer clicks.    The deeper you drill down, the more details you'll find in the landing pages and table of contents.  For example, the onsite installation landing page showcases main areas of the overall subject, allowing easy access to targeted sections within that topic.  In each section you can filter the table of contents to search a specific term within the table of contents tree.  Or you can use the site-wide search  to find exactly what you are looking for.  Continuous delivery   The old pipeline was a mixture of build tools, scripts, custom executables, and duct tape resulting in 7 self-contained websites pertaining to individual technology stacks.  Now, we build using  DocFx , an open-source static site generator. All content is version controlled and every change is linked to one or more GitHub issues (work items). This enables us to automatically build the output when new versions of the software are released, with current up-to-date documentation. Yet, we can also easily add new content as it becomes available and fix typos and broken links when needed.  Community contributions  Hosting content on GitHub not only provides us the ability to transparently manage content, but it provides us with a place to point inclined community members to go create issues , provide feedback , monitor that feedback, and even contribute to our content .  You can share a page on Twitter, on Facebook, or via email. Clicking Feedback or Edit will take you to GitHub to either submit feedback or submit an edit for that particular page.  And we have a whole section to help you get started with Markdown, Git, and DocFx:  Practical Implications  What does this mean in the broad scheme of things? All we have done is move the technical documentation and developer documentation out of the community site and combined the content into logical areas of the dedicated documentation site. Unfortunately, hard-coded links from old forum posts will break . The easiest way to locate the linked content is to use our search. Let us know if you have trouble finding something :)  We plan to redirect all traffic from the existing Technical and Developer documentation to the new docs site as soon as Friday, June 25th . In conclusion  This is just the beginning. Visit docs.superoffice.com today and let us know what you think! And if so inclined, do take advantage of those collaboration features to provide feedback or make suggestions.  See the contribute section on the site for more information.  We hope you find this useful and interesting!  Please let us know what you think by providing feedback on our discussion board on the GitHub repository.  Go check it out !  Disclaimer: You will need a github account, but the good news is that registration is super simple!  https://github.com/SuperOfficeDocs/feedback/discussions      

Tony Yates
23-06-2021
thumb_up0 mode_comment3

Synchronizer for SuperOffice | Video Meetings and Participants information

Good news for all Synchronizer for SuperOffice Online customers; from now on, the Synchronizer will synchronize video meeting URL's, and participant information is displayed in the body of the appointment! Curious: Watch the 3-minute highlight video .

Pierre Van Mever
30-03-2021
thumb_up0 mode_comment3

How to integrate a voice assistant using CRMScript, ClientCrossMessaging, Custom API & Alan AI

As voice assistants become more robust, I had the idea to integrate one into SuperOffice. At the end of this tutorial, you’ll find a short video demonstrating all examples and the full ready-to-go package as a download.   Getting started The first thing we need to do is sign up to Alan and create a voice assistant where we can add some code to let Alan listen to our speeches. In the first example, we want to send SuperOffice data to Alan.  We add a simple “Hey SuperOffice” and Alan should respond with “Hello [SuperOffice User Firstname]!”.  Unfortunately, I couldn’t use “Hey Hugo”, because Alan recognized my spoken word “Hugo” as “Google” all the time :( Let’s start by receiving data from SuperOffice in the voice script. For this, we use Alan’s Project API to send information from our CRMScript to the voice script.  We store the SuperOffice user’s first name (more on this later) in the special userData variable which persists between all voice sessions: projectAPI.setClientData = function(p, params, callback) { p.userData.user = params.user; callback(null, "Data received by Alan"); }; Next, we add our first intent and make it more dynamic so that Alan not only recognize “Hey” but also “Hello”, “Hi”, “Good morning”, etc. And then we grab the user’s first name from our userData object: intent("(Hey|Hi|Hello|Good morning) SuperOffice", p => { p.play("Hello " + p.userData.user.firstname + "!") }); This is it, now let’s jump over to SuperOffice, create a new CRMScript in which we initialize Alan and print the active user’s first name into the parameters of the callProjectApi function so that we send it to Alan every time a user opens our script through a web panel: %EJSCRIPT_START% <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Voice Assistant</title> </head> <body> <div class="alan-btn"></div> <script type="text/javascript" src="https://studio.alan.app/web/lib/alan_lib.min.js"></script> <script> var alanBtnInstance = alanBtn({ key: "ENTER YOUR KEY HERE (ALAN STUDIO -> INTEGRATIONS)", onCommand: function (commandData) {}, rootEl: document.getElementById("alan-btn"), }); alanBtnInstance.callProjectApi("setClientData", { user: { firstname: "<%print(getActiveUser().getValue('firstname'));%>" }}, function (error, result){ if (error) { console.log(error); return; } }); </script> </body> </html> %EJSCRIPT_END% Last, we create the web panel with the includeId of the script: Yeah, works great. Alan answers with “Hello Dennis!”. (see example in video below)   ClientCrossMessaging In this example we want to let Alan navigate us through different SuperOffice screens. For example if we say “Go to contact”, “Go to person”, “Go to sale”, “Go to service” etc. it should automatically jump to the requested screen. To be able to navigate, we use the  ClientCrossMessaging js library to communicate from our embedded web panel script to the SuperOffice client. So first, let’s add the ClientCrossMessaging snippet to our CRMScript: %EJSCRIPT_START% <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Voice Assistant</title> </head> <body> <div class="alan-btn"></div> <script> var SuperOffice = SuperOffice || {}; SuperOffice.ClientCrossMessaging = SuperOffice.ClientCrossMessaging || {}; (function(ns) { var sendCommand = function(command, args) { var message = { "command": command, "arguments": args}; parent.postMessage(message, "*"); } ns.refresh = function() { sendCommand("refresh"); } ns.executeSoProtocol = function(protocol) { sendCommand("soprotocol", protocol); } ns.openDocument = function(documentId) { sendCommand("openDocument", documentId); } ns.ajaxMethod = function(method,...args) { var a = [method,...args]; sendCommand("ajaxMethod", a); } }(SuperOffice.ClientCrossMessaging)); </script> <script type="text/javascript" src="https://studio.alan.app/web/lib/alan_lib.min.js"></script> <script> var alanBtnInstance = alanBtn({ key: "ENTER YOUR KEY HERE (ALAN STUDIO -> INTEGRATIONS)", onCommand: function (commandData) {}, rootEl: document.getElementById("alan-btn"), }); alanBtnInstance.callProjectApi("setClientData", { user: { firstname: "<%print(getActiveUser().getValue('firstname'));%>" }}, function (error, result){ if (error) { console.log(error); return; } }); </script> </body> </html> %EJSCRIPT_END% Next we've to add some more code to our Alan instance onCommand function so that we can receive the user’s requested screen and use the executeSoProtocol function from ClientCrossMessaging to navigate.  If the user wants to go to Service we’ll not use executeSoProtocol, but window.open to open Service in a new tab like the existing Service button at the left navigator. We simply print getProgramTicket() to get the Service url. %EJSCRIPT_START% <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Voice Assistant</title> </head> <body> <div class="alan-btn"></div> <script> var SuperOffice = SuperOffice || {}; SuperOffice.ClientCrossMessaging = SuperOffice.ClientCrossMessaging || {}; (function(ns) { var sendCommand = function(command, args) { var message = { "command": command, "arguments": args}; parent.postMessage(message, "*"); } ns.refresh = function() { sendCommand("refresh"); } ns.executeSoProtocol = function(protocol) { sendCommand("soprotocol", protocol); } ns.openDocument = function(documentId) { sendCommand("openDocument", documentId); } ns.ajaxMethod = function(method,...args) { var a = [method,...args]; sendCommand("ajaxMethod", a); } }(SuperOffice.ClientCrossMessaging)); </script> <script type="text/javascript" src="https://studio.alan.app/web/lib/alan_lib.min.js"></script> <script> var alanBtnInstance = alanBtn({ key: "ENTER YOUR KEY HERE (ALAN STUDIO -> INTEGRATIONS)", onCommand: function (commandData) { if (commandData.command === "navigate") { if (commandData.screen === "service") { window.open("<%print(getProgramTicket());%>"); return; } SuperOffice.ClientCrossMessaging.executeSoProtocol(commandData.screen); } }, rootEl: document.getElementById("alan-btn"), }); alanBtnInstance.callProjectApi("setClientData", { user: { firstname: "<%print(getActiveUser().getValue('firstname'));%>" }}, function (error, result){ if (error) { console.log(error); return; } }); </script> </body> </html> %EJSCRIPT_END% Last but not least jump over to your voice script and add another intents. Again we want to accept more words than only “Go”. We add “Jump” and “Open” as well. If we put an object into the play function Alan will send this back to the client and not just say the text. The value for the screen key is simply the string that the executeSoProtocol function from the ClientCrossMessaging library can process. You can get the correct soprotocol string in the url search parameters while navigating in SuperOffice yourself. intent("(Go|Jump|Open) (to) Dashboard", p => { p.play({"command": "navigate", "screen": "dashboard"}) }); intent("(Go|Jump|Open) (to) (Contact|Company)", p => { p.play({"command": "navigate", "screen": "contact.main"}) }); intent("(Go|Jump|Open) (to) Person", p => { p.play({"command": "navigate", "screen": "person.main"}) }); intent("(Go|Jump|Open) (to) Sale", p => { p.play({"command": "navigate", "screen": "sale.main"}) }); intent("(Go|Jump|Open) (to) Project", p => { p.play({"command": "navigate", "screen": "project.main"}) }); intent("(Go|Jump|Open) (to) Selection", p => { p.play({"command": "navigate", "screen": "selectionsearch.main"}) }); intent("(Go|Jump|Open) (to) Service", p => { p.play({"command": "navigate", "screen": "service"}) }); Additionally let’s add another intent with more logic. We want to let the user choose between Diary: Day, Week, Month or View. We store the option in a variable and do a switch to send the correct soprotocol: intent("(Go|Jump|Open) (to) (my|the) (Diary|Calendar) $(C day|week|month|view)", p => { switch (p.C.value) { case "day": p.play({"command": "navigate", "screen": "diary.day"}) break case "week": p.play({"command": "navigate", "screen": "diary.week"}) break case "month": p.play({"command": "navigate", "screen": "diary.month"}) break case "view": p.play({"command": "navigate", "screen": "diary.view"}) break default: p.play({"command": "navigate", "screen": "diary"}) } }); Great this works smoothly. See the gifs:   Custom API In the last example we want to let Alan get data from SuperOffice and say the amount of user’s appointments for today if I ask him: “How many appointments do I have today?” To make this work we create another CRMScript as Rest API which Alan can call, get and recite the data. I don’t go into further detail regarding creating Custom API’s with CRMScript, because Frode created this great tutorial here . Of course, you can use our Official API as well, but I want to give you a quick reminder on what great things you can do with CRMScript. In the new script we grab the user`s associateId from the parameters via getCgiVariable() and use the SearchEngine to get the amount of user`s appointments for today.  Additionally I use the CRMScripts HTTP library in another CRMScript and include it here to simply respond with predefined headers and status codes. %EJSCRIPT_START% <% #setLanguageLevel 3; #include "voiceAssistantHTTP"; Integer associateId = getCgiVariable("associateId").toInteger(); if (associateId > 0) { SearchEngine se; se.addField("appointment.appointment_id"); se.addCriteria("appointment.associate_id", "equals", associateId.toString()); se.addCriteria("appointment.do_by", "gte", getCurrentDateTime().moveToDayStart().toString()); se.addCriteria("appointment.do_by", "lte", getCurrentDateTime().moveToDayEnd().toString()); se.execute(); print('{"count":' + se.countRows().toString() + '}'); } else { print('{"message":"Invalid associateId"}'); BadRequest(); } %> %EJSCRIPT_END% Next we've to do some adjustments to our main web panel CRMScript’s callProjectApi function. Remember we only send the first name to Alan? Let`s add the associateId to our user object that is required by our custom api and the url of our custom api in a new object called client. alanBtnInstance.callProjectApi("setClientData", { client: { apiUrl: "<%print(getProgramCustomer()+'&action=safeParse&includeId=voiceAssistantAPI&key=voiceAssistantAPI');%>" }, user: { associateId: "<%print(getActiveUser().getValue('associateId'));%>", firstname: "<%print(getActiveUser().getValue('firstname'));%>" }}, function (error, result){ if (error) { console.log(error); return; } }); Now we've to adjust our voice script to include the client object so that we make our api url accessible through the userData object as well. projectAPI.setClientData = function(p, params, callback) { p.userData.client = params.client p.userData.user = params.user; callback(null, "Data received by Alan"); }; Last we've to add our new command. This time we use the question function and it’s really great that Alan supports axios to make API calls. question("How many appointments do I have today?", p => { const url = `${p.userData.client.apiUrl}&associateId=${p.userData.user.associateId}`; api.axios.get(url) .then((res) => { p.play(`You have ${res.data.count} appointment${res.data.count === 1 ? "" : "s"} today`); }) .catch((err) => { console.log(err); p.play(`Could not get appointment information`); }); }); Done. When I ask Alan now “How many appointments do I have today?”, Alan responds with “You have two appointments today”. When you add another appointment for today and ask Alan again then you’ll get the new amount. It's really fun to play around with it. (see example in video below) Of course, you can also expand this example to get any data from SuperOffice or write data to SuperOffice. Alan AI not only provides intent and question, but also reply and follow to create certain conversational circumstances or dialog branches like one idea that came directly into my mind: You: “Create a Contact” Alan: “What is the name of the contact?” You: “SuperOffice GmbH” Alan: “In which country is the contact located?” You: “Germany”  ... -> Call Google Places API with the contact name and country to collect all the information about the contact like address etc. P ost to SuperOffice API to create the contact with the user’s inputs and Google Places API data. In the end navigate to the created contact via ClientCrossMessaging.   A million possibilies The thing that strikes me about using voice assistants on the web is that there is so much under-explored territory. I've been experimenting with it for a while now, and I still feel like I'm just scratching the surface. You've been given the examples to start experimenting and I'd encourage you to have some fun with this, and see where it takes you :) If you enjoyed this tutorial, comment with your ideas, business logics and I'll add them here sooner or later. Let me know if you've any questions. Best, Dennis   Links Alan AI ClientCrossMessaging CRMScript Custom API CRMScript Libraries   Video https://vimeo.com/503917365   Package You can import this package with Service. There you'll find the Alan voice script (paste this code into your voice assistant editor), the web panel script, custom api script & http library script. Remember to put in your Alan key in the top variable of the voiceAssistantPage script to make it fully functional. Download

Dennis Pabst
24-01-2021
thumb_up0 mode_comment8

Latest Forum Posts

  • Marcus Svenningsson

    Hi, If I programmatically want to administrate the Tags-list from CRMScript, is the NSMDOAgent the recommended class to work with? I'm not thinking in the context of a Ticket now, but the Tags-list itself. A potential alternative is to use SearchEngine to just edit the Tags-table, as long as you honor the specific behaviour of a list, such as Soft Delete using the Delete-flag, handling the Rank-field, etc. But you never know what kind of extra logic that might be executed as well when using the NSMDOAgent instead. But if no other extra magic is happning, this might be the an alternative. :) In this specific case I'm more interested in importing a list of tags from a Prod-environment to a Test-environment and find it a bit tedious to add this manually. The NSMDOAgent-object seems a bit tedious to work with for administrating the tags-list. Does anybody have any out-of-the-box example that uses the NSMDOAgent for adding new tags? I would like a minimal level of coding-overhead. I suppose that a creative alternative is to just add a ticket where I add the list of extra tags and let the system create them for me. But now I'm also interested in the different methods that might be used programmatically. Different classes Can anybody explain the difference between the classes: NSMDOListItem NSSelectableMDOListItem The GetMethods of the MDOAgent seem to return the same number of items and it doesn't seem to be related to returning only non-deleted items or not, or anything like that, so I suppose they server some other purpose? But I notice that the only Set-method of the MDOAgent works with a NSSelectableMDOListItem-array. MDOAgent - Workflow What is the needed workflow to add new tags to the tags-list using the MDOAgent? * Do I first have to collect an array of NSSelectableMDOListItem's from the tags-List? * Then create a NSSelectableMDOListItem that I add to the array?    * Which fields are required to be set?    * Can the Rank-field be omitted to be handled automatically by the agent or do I have to set this manually? * Then use that item-ref in the NSMDOAGent.SetSelected()-method? * It seems that this method enforces that the list is always updated as a whole list, it doesn't seem possible to just add an item by itself using some kind of method, or is there some other class or method that could be used? /Marcus

    Marcus Svenningsson 01-25-2022
  • Martin Andersen

    OK, thank you. It would be nice if the data somehow would be available maybe as userpreferences. This would also mean that SuperOffice could maintain the files when moving environment etc. --Martin

    Martin Andersen 01-24-2022
  • Rich Hacker

    Hi, Are we able to send an email from Customer Service relating to a Ticket, but not a ticket message? I want to be able to create a templated email based on a Ticket Number, so I can send an email (from Customer Service) about a Ticket. I have used Rest to create a templated message based on the Ticket (Agents/CustomerService/GetParsedTemplate), and then used the Email endpoint (Agents/EMail/Send) to send an email from the logged in user, but Ideally, I want the email to come from Customer Service. Ideally, I'd want an endpoint that is like (Ticket/SendTicketMessage) but is called (Ticket/SendTicket) where I'd pass the Ticket Number and the ReplyTemplateId. Cheers Rich    

    Rich Hacker 01-19-2022
  • Frode Lillerud

    Same thing happened today, only this time only standard SO was involved, no customizations. The chat management functionality in Service broke because of duplicate XSRF cookies for an Online customer.

    Frode Lillerud 01-18-2022
  • Marc Eberhard

    Hi Michel, my assumption was that setOutputValue should display values in front end (browser). However, it sets values to be saved in the before save trigger . In that respect, it works as designed. If I call setOutputValue in the before save trigger of person, then the database is updated automatically, and the new value is displayed in the browser, as expected and tested in 10.0.5 However, the issue remains, that we cannot refresh the browser from inside an after save trigger. That is, ed.setNavigateTo("soprotocol:person.main[refresh=true]") has no effect there, as tested in 10.0.5 Best regard, Marc

    Marc Eberhard 01-18-2022
  • Anders Larsson

    Hi, No I have not. In my case this is on prem as far as I can see above is for Online Only since it requires a CustId ? But maybe that uses some built in endpoint in superOffice that also i available in the OnPrem version of SuperOffice?   //Anders

    Anders Larsson 01-17-2022
  • Tony Yates

    Hi Chris-Anton, There are a couple different types of licenses which enable certain features and functions. There are: User plans Developer Tools It sounds like you have developer tools, but perhaps some of the classes that don't seem to work for you aren't included under the user plans. The Notify methods are something more inline with Service plans, not Sales.  Please click the User plans link above to find out more about what areas of the product your plan covers, which also translate into which API classes are available. Hope this helps!  

    Tony Yates 01-14-2022
  • Espen Steen

    Am I correct in saying this is still not supported for Extra menus? Doesn't seem to work anyways. Any chance this is going to be fixed?

    Espen Steen 01-14-2022
  • Anders Larsson

    Hi Erik! Ok, yes please make try to get a patch for 9.2 R12 available but as you say donot put to much effort into it. If the upcoming 10.0.5 still will have the feature toogle for configurble screens I think we will be able to upgrade big onsite customers to version 10 instead of 9.2 R12 I think David mentioned something about license issues for upgrades to 9.2 in this thread and also download issues for 10.0.2 and freetext search issues (both 9.2 and 10.0.2) ?  FreeText search 9.2 R12, count query (superoffice.com) 10.0.2 OnSite release missing? (superoffice.com) /Anders

    Anders Larsson 01-14-2022
  • Tony Yates

    Hi all, Just a quick message to let you know that we have kicked off a project to consolidate most of the content we have on https://www.github.com/SuperOfficeDocs, which is used to generate https://docs.superoffice.com. Today there are 5 main content repos:  crmscript data-access database superoffice-docs user-interface Initially, when migrating all of the technical and developer documentation from the community site, it made sense to create different repos for the relevant areas and stakeholders. However, as we have gained knowledge and experience working with content, and community contributions, it now makes more sense to consolidate a majority of the content into a single repo.  The consolidation simplies working with the content, managing feedback and user contributions. We are open and transparent on this, and have shared our initial plans here on github:  Monorepo · Issue #179 · SuperOfficeDocs/superoffice-docs (github.com) . While we don't expect this change to have any impact on the community, we do want those of you who have contributed to the docs to know that we do this to improve your experience working with us and the content.  Best regards.

    Tony Yates 01-13-2022
  • David Hollegien

    Hello, You can retrieve the current user like this: #setLanguageLevel 3; User activeUser = getActiveUser(); See the documentation for what you can do with this object.

    David Hollegien 01-13-2022
  • David Hollegien

    Frode suggestion is a good one, the SuperOffice .NET generated proxy's set the propery IsActive on the ArchiveRestrictionInfo to True by default, but if you generate your own proxy's you need to set this manually.

    David Hollegien 01-11-2022

Aktive fora

  • Marcus Svenningsson Service and CRMScript Discussion

    For all questions pertaining to CRMScript, including classes, functions, triggers and screens.

    01-25-2022 mode_comment 11741
  • Frode Lillerud CRM Web Application

    For all things related to the web client: configuration, data handlers, AJAX, background task, SCIL, custom UI, web panels, SoProtocol, etc.

    01-18-2022 mode_comment 6177
  • Rich Hacker Online development and web service API's

    For all things related to SuperOffice web services, including SOAP and REST API's.

    01-19-2022 mode_comment 4435
  • Martin Andersen Client libraries and tools

    Discuss NetServer libraries, packages, and tooling related to core APIs, Continuous Database (CDD), Plugin-in, Entities, Rows, OSQL, Archive and MDO providers, etc.

    01-24-2022 mode_comment 4142
  • Tony Yates Technical announcements

    Area for announcing product and API issues of a technical nature.

    01-13-2022 mode_comment 113