D365 PSA: Restrict Project access only to their Project Managers

Out-of-the-box PSA’s Project Manager security role provides complete access to even other Project Managers. But then, what if you want to bring down the access of the Project Managers to their own Projects only?

Remember, access in D365 PSA is provided for Owner (ownerid) field and not Project Manager (msdyn_projectmanager) field.

PSARoleRestrict

Scenario

Now, I don’t want a Project Manager to have access to others Projects and looks like this can’t be controlled from the Security Level perspective, given the Project Manager is a separate field than Owner of the Project.

So, I’ll limit the access to only the User level (the one who created the record would have the access, obviously)

PSARoleRestrict2

But this remove the access from even the Project Managers since they don’t own the Projects. To overcome this, I’ve written a simple plugin to provide access to the Project Manager whenever they are updated by Sharing and giving PMs the access.

For this, I’ve written a plugin code that will grant all permissions to the Project Manager of that Project and I would like to share this with you all to consume it.

GitHub Project

Here’s the GitHub repository I’ve created which has the plugin code and the Unmanaged Solution that contains only the plugin assembly and the registered step –

Link: D365PSA-PMAccessRights

gitProj

The D365 Unmanaged Solution resides here –

unmanagedSoln

This will work in the following scenarios –

  1. When a Project Manager is changed from Person A to Person B, the access rights of Person A will be removed and granted to Person B.
  2. You can even create a trigger field and use an on-demand workflow to set the trigger. This trigger should be included in the filtering attributes of the plugin step to update the existing records.

This will provide access to the Project Manager of the Project automatically apart from the Owner so that they see/access only Projects that concern them
accessGiven

Make sure no other security role is overriding your restricted access.

Hope this helps! 🙂

Get SharePoint Document Location link on field on create in D365

I’ve been working on getting the SharePoint Document’s link to get back into D365 but looks like it can’t come back and get tagged to the record it was created from.

I tried to fire off a plugin on SharePoint Document record create, but in vain. Flow didn’t do justice since SharePoint Document entity doesn’t support Change Tracking.

So, I retrieved the Absolute URL of the “SharePoint Document Location” entity on it’s create itself so that I have the link once the record is created. And click that link to open the folder in SharePoint.

Workflow to wait and then fetch

So if you immediately make a call to retrieve the Absolute URL in the plugin code you’ve written on Create won’t work because Absolute URL gets created moments after the actual Location record is created unlike being passed in the execution context.

My approach is to fire the workflow on the create of the SharePoint Document Location record and Wait for 1 minute.

wfBody

After 1 minute, set off the flag to call the plugin and fetch the Absolute URL as shown below –

updateFlag

Retrieve Absolute URL in Plugin

You can use RetrieveAbsoluteAndSiteCollectionUrlRequest message to retrieve the SiteCollection URL and the Absolute URL of the document folder of the record

retrieveAbsolute

 

Working

  1. When you open the Document sub-grid on the record for the first time, a Document Location record is created –
    openForFirst
  2. The workflow designed above will run and fire off the plugin after 1 minute. The plugin will then make the message request go through to get you the Absolute URL as below –
    link2
  3. And probably you can use that link to open up the folder by clicking on the field that has this URL or send it across in email to internal users (whatever suits your requirements)
    linkInField
  4. It will open up the SP folder for that record and will have all the documents you attach in the Document sub-grid on the record.
    spFolder

Hope this helps!

D365 Quick Tip: Bulk Clear field values

A very handy approach for admins and users of Dynamics 365 who want to bulk clean up field values – And just selecting them in Bulk Editing them as shown below doesn’t help!!

So here’s the scenario – You want to clear the selected records for their Credit Score field
containsData

Because primarily, you can commonly put a value in a field using Bulk Edit, but not clear the value.

 

Workaround

What you can do instead, create a quick and simple workflow to clear the field.

  1. Create an On-Demand workflow on Contact entity with an Update step for Contact
    workflowBody
  2. In the Update step, point to the field and then select the Operator on the right hand side to select Clear
    operator
  3. Make sure the Clear appears on the field you want to Bulk Update
    clearField
  4. Once done, save and Activate the workflow. Run on the selected records you want to clear at once
    runWorkflow
  5. The values will now be cleared for these records
    cleared

Hope this helps!

Opt-in for April 2019 Preview Updates

Finally, as scheduled on 1st Feb 2019, April 2019 Preview Updates can now be opted in for your organization.

Opting-in is available for Sandbox, Trail and Production environments.

Opt-In

  1. You can now go to https://admin.powerplatform.microsoft.com/ and look for the Organization on the left hand pane
    pPlatformEnv
  2. Select your Organization, look for Updates section on the bottom or right hand side
    manageOrgs
    Zoomed In
    zoomedManage

  3. Click on Activate now. Be careful, these changes can’t be undone.
    activateNow
  4. Enter your Org name and click Continue
    orgName
  5. And it will take some time to activate
    activating

 

And once you are set, you’ll see that the April 2019 update was applied –

aprilApplied

 

Happy D365’ing!

Linear Slider Custom Control in D365 v9.x UCI

Using Custom Controls is the new cool in Dynamics 365. Specifically, if visual cue of approximation or ‘to what extent’ is priority over the textual/numeric data, using Custom Control is the best way forward.

Something like this –

featured

Use Case

In my use case, I want to know the client budget so that I keep Quotes for them around the range they can afford.

Now, number will give me an idea. But a visual cue of the same will let me know the spending capacity of the client in the bigger picture.

So, I’ll use Linear Slider custom control on the Client Budget currency field to show a slider as well as the currency value.

Enabling Linear Slider on Currency Field

  1. So here, Client Budget (new_clientbudget) is my Currency type of field in D365.
  2. On the Form Editor, I’ll go to Properties of the field and go to Controls. Click on Add Control…
    addcontrol

  3. Select Linear Slider among others and click Add.
    addslider
  4. Then, I’ll set the properties of the control. Make sure you enable them for Web, Phone and Tablet as per your preferences.
    sliderproperties
  5. I’ve set the min and max range for the control, also that step which should reflect while moving the slider.
  6. Finally, click OK and publish changes.

 

Linear Slider

featured

You can even input custom number in the box and the slider will set to it.

manualnumber

 

Hope this was useful! 🙂

Thanks for reading.

D365 Quick Tip: Choose how currency field is displayed

In D365 CE Apps, you have 2 options to display the currency fields, by symbol or by the currency code.

Symbolic representation

symbolic

Currency Code representation

coded

Setting

With a simple setting, you can apply this change organization wide. Navigate to Settings > Administration > System Settings and under General tab, look for Set the currency display option.
setting

Pretty simple! 🙂

Run Dynamics 365 Diagnostics to check network latency

If you’ve heard complains about D365 running poorly throughout on a particular day, not necessary the issue could be with D365. It could be network latency.

And one of the first thoughts would be “To try on a different browser” without much investigation on it.

In fact, it could be bandwidth or latency issue. You’ll need Dynamics 365 Diagnostics here.

Check Latency

  1. You need to login to your browser session with your D365 credentials
  2. Enter this URL in a new tab https://<ORGNAME>.crm.dynamics.com/tools/diagnostics/diag.aspx
  3. It will show you a Dynamics D365 Diagnostics page like thisdiagnosticspage
  4. When you click on Run, it takes a few seconds to perform the test before showing you the results
    results

Hope this helps!

 

D365 For Outlook 2016: There is a Problem communication with the Microsoft Dynamics CRM server for D365 v9

One of the recent and most frequent issues faced while upgrade is that of the existing Dynamics 365 For Outlook 2016 setup which doesn’t connect to D365 v9.

Right after the environment upgrades to v9, D365 For Outlook’s older version doesn’t connect.

But that’s not the end of the story, obviously, there’s is an upgrade. So let’s see how to go about this process and why this happens.

Error

When you’re trying to re-enter credentials or connect to D365 v9 from the existing D365 For Outlook version, you see this error
error

Reason

The reason is that D365 version 9 required TLS 1.2. Detailed explanation of which you can find here – https://support.microsoft.com/en-in/help/4054414/dynamics-365-for-outlook-update-for-version-9-0?LCID=1033

Version Upgrade

You can either choose to upgrade to D365 For Outlook v8.2.2.137 which you can download from here – https://www.microsoft.com/en-us/download/confirmation.aspx?id=56327

Or, if you don’t have any pre-installed version, you can also directly setup D365 For Outlook – https://www.microsoft.com/en-us/download/details.aspx?id=56972

Make sure you have upgraded your D365 to v9 first. I’ve posted a related blog regarding this in the past and you can refer it here – https://d365demystified.com/2018/11/13/d365-quick-tip-higher-version-of-d365-for-outlook-wont-work-older-d365-online/

 

Hope this helps! 🙂

Delete Async Plugin Logs if plugin succeeds, save D365 storage space

Let’s see how we can efficiently manage D365 storage without bloating the storage with data that you might not need.

In my opinion, we don’t really need to know that the background process was successful or not, we typically care for what failed.

So, from an Asynchronous plugin standpoint, the logs in D365 is registered in the System Jobs and they create a ton of System Events if you are Importing data in D365 and your Async process is on the create of such records.

sysjobs

Check your Async plugin step

  1. Now, you can preserve this storage space by choosing to Delete the Async plugin logs.
  2. In the screenshot below, you can see an option to ‘Delete AsyncOperation is StatusCode = Successful
    deletelog

In this case, the System Jobs for the will not be created, thus, saving you valuable storage space if your plugin is run frequently.

Hope this helps.

Enable entity for Party List selection in Appointment

Out-of-the-box, you have fixed set of entities enabled for Party List fields in Appointment entity. Of which, you can select to be either in Required or Optional fields on Appointments.

But, what if you want to enable a custom entity for the same? You can do that was well.

Enable Entity for Sending Email

  1. In your custom entity, you can turn on Sending Email option on the entity level and the entity will be enabled for Party List.sendingemails
  2. And Publish your customization.
    Now, when you select the Required/Optional field in Appointment, Look for More Records
    lookForMoreRecords.png
  3. Select the Look For option to expose available entities
    expandlookfor
  4. And look for the custom entity you created i.e. Office Representatives my this case.
    selectentity
  5. And select the record you want
    jamieg
  6. And the custom entity record will be added to the Party List field
    addedtolist

The reason your see them enabled is because Email Address (emailaddress) field has been created for the entity i.e. the entity is now Email enabled.

Hope this helps!