Search icon CANCEL
Subscription
0
Cart icon
Your Cart (0 item)
Close icon
You have no products in your basket yet
Arrow left icon
Explore Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Free Learning
Arrow right icon
Microsoft Dynamics 365 Extensions Cookbook
Microsoft Dynamics 365 Extensions Cookbook

Microsoft Dynamics 365 Extensions Cookbook: Add functionality to existing model elements, source code and finally package and deploy using DevOps

eBook
€8.99 €36.99
Paperback
€45.99
Subscription
Free Trial
Renews at €18.99p/m

What do you get with Print?

Product feature icon Instant access to your digital eBook copy whilst your Print order is Shipped
Product feature icon Paperback book shipped to your preferred address
Product feature icon Download this book in EPUB and PDF formats
Product feature icon Access this title in our online reader with advanced features
Product feature icon DRM FREE - Read whenever, wherever and however you want
OR
Modal Close icon
Payment Processing...
tick Completed

Shipping Address

Billing Address

Shipping Methods
Table of content icon View table of contents Preview book icon Preview Book

Microsoft Dynamics 365 Extensions Cookbook

No Code Extensions

In this chapter, we will cover the following recipes:

  • Modeling denormalized entities
  • Modeling normalized entities with a common parent
  • Modeling independent normalized entities
  • Using a Business Rule to show and hide attributes
  • Building a configurable e-mail notification workflow
  • Building your first action
  • Setting up rollup fields
  • Setting up calculated fields
  • Duplicate detection using alternate keys

Introduction

Commercial off-the-shelf products (COTS) are attractive options for enterprise organizations as they are packed with configurable out-of-the-box features that address a good portion of business requirements without writing any code. Dynamics 365 is no exception. Dynamics CRM 365 specifically offers a powerful modularized feature-rich product that can be tailored to suit your organization's needs.

Generally speaking, configurable, no-code extensions are cheaper to implement, easier to maintain, and easier to upgrade, as the product evolves. Modeled correctly, those extensions can greatly enhance the value of your investment. Modeled incorrectly, they can lead to a platform that is locked down to one purpose only.

Using the same analogy as that of the Dynamics 365 suite, you can build your CRM application for general use by loosely coupling your entities, or you can build a specialized application by tightly coupling all the content. The following picture taken from the Dynamics 365 Microsoft marketing pack visualizes a specialized implementation versus a more general one:

A specialized implementation is not necessarily wrong, as some applications won't make sense if rendered generic, especially as some organizations work in siloed business units. That said, most organizations prefer a more flexible implementation.

This chapter will cover different schema-modeling techniques to deal with different business scenarios, along with their respective pros and cons. It will also cover out-of-the-box configurable business logic extensions that were introduced over the last few years, which drastically reduce the amount of code required to configure implementations.

To give context to our configuration, we will model our entities based on a college solution with a student/contact management system. The system will hold contacts that can either be generic individuals, students with graduation details, or contractors working for the college.

Modeling denormalized entities

Typically, account and contact entities are the most commonly used entities in a Dynamics CRM implementation. In large implementations, those entities are usually also reused for multiple purposes. To illustrate the modeling pattern, this recipe will leverage the college solution described in the introduction. We shall concentrate on creating contacts that can either be individuals or students. Each type of contact requires a different set of attributes.

The easiest way of modeling a multi-purpose entity is to add all the required attributes for the different types to the same entity.

Getting ready

In order to configure the schema, you will need to have access to a Dynamics 365 instance along with a System Customizer or higher security role . As a best practice, it is always recommended that you implement your configuration within a solution. For the purpose of this book, it is expected that you already have a solution created called Packt with a publisher prefix of packt_.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Click on Add Existing | Entity and select Contact, as shown in the following screenshot:
  1. Select the necessary assets that support your configuration and add them to your solution, or, for simplicity, select Add All Assets and click on Finish:
  1. Click on No, do not include required components.
  2. Navigate to Entities | Contacts | Fields.
  3. Click on New, and create an attribute called Student Id of type Single Line of Text, and click on Save and New.
  4. Create an Option Set attribute called Contact Type that contains two values; Student and Other. Then click on Save and Close.
  5. Back in the solution, navigate to Entities | Contact | Forms and click on New | Main Form as per this screenshot:
  1. In the newly created form, add the two newly created fields to your form by dragging and dropping the entities from the right-hand window onto the form.
  2. Click on the Publish All Customizations button for your solution.

How it works...

Just like database modeling, entities can be normalized or denormalized. Normalizing a structure is the action of separating it into several related tables to reduce redundant data or empty fields. Denormalizing a structure is the opposite: we merge two or more tables together to simplify the structure and improve query performance, whilst adding redundant or empty fields. In this recipe, the entity was denormalized to allow different types of contacts to be surfaced through the same contact entity.

In step 1 to step 4, we added the existing contact entity to the Packt solution. Notice that in step 3, we had the option to either add the necessary assets or add all assets. For this recipe's simplicity, we added all assets. With the recent granular solution enhancements, we can simply add what is required.

It is a best practice to minimize the number of unnecessary attributes and relationships in a solution to avoid conflicts and dependencies.

In step 5 to step 7, we created the attributes, and in step 8 and step 9, we added the attributes to a new contact form. In step 10, we published the configuration we implemented.

To avoid multi-solution dependencies and scenarios where a form is overwritten with an updated version from another solution, best practice dictates that you create a new form for your solution and mark it as default. Unnecessary forms can always be hidden by using Apps as described in Chapter 9, Dynamics 365 Extensions.

Looking at the design of the updated entity, we have now configured the contact entity to fulfill more than one purpose: it is a generic contact as well as a student one.

A simplifiedEntity Relationship (ER) diagram is depicted in the following screenshot:

The advantages of a denormalized model are:

  • Views will appear in the same combined list
  • A quick and advanced find will include both types and display the results in the same list
  • Positive form user experience, driven by the form configuration

The disadvantages of a denormalized model are:

  • Security roles cannot easily be made specific to types
  • Configuration/customization is required to show/hide irrelevant attributes or to mark them as mandatory or optional
  • Records will contain blank fields when not applicable

See also

  • Modeling normalized entities with a common parent
  • Modeling independent normalized entities
  • Using Business Rule to show and hide attributes
  • The Dynamics 365 applications recipe of Chapter 9, Dynamics 365 Extensions

Modeling normalized entities with a common parent

Similar to database modeling, the alternative to a denormalized model, is, you guessed it, a normalized model. Normalizing a structure is the action of separating a table into two or more structures. Normalization reduces the number of redundant or unnecessary fields in a form. In the Dynamics 365 context, normalizing will help avoid overcrowding one entity by spreading the attributes across different entities whilst keeping a common parent.

In this recipe, we will carry on using the contact entity and extending its relationships to include additional attributes: student graduation details.

Getting ready

Similar to the previous recipe, System Customizer or higher security role is required to perform the configuration as well as a solution to contain the changes.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Click on New | Entity.
  3. Enter Graduation Details in the Display Name field, and Graduations Details under the Plural Name field.
  1. Before saving the new entity, untick all the check boxes on the form:
  1. Click on the Save button.
  2. Navigate to Fields on the left-hand side and click on New.
  3. Create an attribute called Supervisor of type Lookup with a Target Record Type set to user and click on Save and Close.
  4. Create another attribute called Post Graduate Start Date of type Date and Time and click on Save and Close.
  5. Navigate to Forms and double-click the Quick View Form option.
  6. Add the two attributes on your form by dragging and dropping them from the right-hand Field Explorer, then click on Save and Close.
  7. Click on Save and Close on the entity as well to go back to your solution.
  8. Navigate to Entities | Contacts | N:1 relationships | New Many-to-1 Relationship.
  9. Enter Graduation Details in the primary contact field, Display Name: Graduation Details and click on Save and Close.
  10. Navigate to the contact's Forms and double-click the Main Information form.
  11. Add the newly created field to your form by dragging and dropping the Graduation attribute from the right-hand window on to the form.
  12. Click on the Insert tab at the top followed by Quick View Form:
  1. Enter the following details in the Quick View Control Properties window:
    • Name: Graduation_Details
    • Label: Graduation Details
    • Lookup Field: Graduation Details
    • Quick View Form: Information
  1. Click on OK:
  1. Click on Save and Close.
  2. Click on the Publish All Customizations button for your solution.

How it works...

Although this recipe is simplified, typical normalized models will contain more than one attribute, as well as more than one entity.

In step 2 to step 11, we created a normalized entity that contains the employee details along with its Quick View. In step 4, we avoided keeping the checkboxes ticked. All the checkboxes with a symbol depict options that cannot be reverted. We can always enable them later if required. As a best practice, if they are not required, don't enable them, otherwise your choice will be irreversible. In step 12 and step 13, we created a relationship between contacts and the newly created entity to provide a navigation path between the parent contact entity and the additional attributes for the specific types (Supervisor and Post Graduate Start Date). In the last steps, step 14 to step 18, we added the lookup as well as the Quick View on the contact form. A Quick View is a simplified sub-view of another record that can be placed on the parent record's form to display the child's subset of attributes in read-only. The red box in the following screenshot highlights the Quick View related to the Graduation Details lookup record:

With this design we can now see the graduate details on the contact form without creating the attributes on the entity itself.

Our ER diagram now looks like this:

The advantages of normalizing your data with a common parent are:

  • Lighter multipurpose parent entity
  • Security roles can control the normalized entities with the additional attributes
However, the primary field value will still appear on the parent form, even if the user does not have read rights to the child entity. Moreover, field level security can be used to obfuscate the lookup's text.
  • Quick Views help display the normalized data on the parent form (read-only)
  • Advanced search can still retrieve and filter information from the related entities
  • Views can contain data from the related entities (non-sortable)
With quick Views, a user can retrieve data that is two levels deep. Attributes from the related record as well as its 1:N or N:N related lists.

This model also has some cons, which are as follows:

  • Degraded user experience as the Quick Views are read-only
  • May require some customization to show and hide irrelevant details
  • Quick search cannot search attributes across the different normalized entities

See also

  • Modeling denormalized entities
  • Modeling independent normalized entities
  • Using a Business Rule to show and hide attributes
  • The Building cumulative security roles recipe of Chapter 7, Security

Modeling independent normalized entities

The third modeling technique is similar to the second, except that the entities are completely independent. This scenario is typically used when there is a logical separation between the entities and there are few commonalities between them, to the point where reusability is not justified.

In this recipe, we will create a new entity called contractor that mirrors the contact entity with some additional attributes.

Getting ready

Similar to the previous recipes, a System Customizer or higher security role is required to perform the configuration, as well as a solution to contain the changes.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Click on New | Entity.
  3. Enter Contractor in the Display Name field, and Contractors under the Plural Name field, and click on Save:
  1. Navigate to Fields on the left-hand side and click on New.
  2. Create an attribute called Hourly Rate of type Currency and click on Save and Close:
  1. Navigate to Contractor | Forms and open the Main Information form.
  2. Add the newly created field to your form by dragging and dropping the attributes from the right-hand window on to the form.
  3. Click on the Publish All Customizations button for your solution.

How it works...

The alternative to the previous two modeling patterns is to keep your entities completely separate. This could prove to be an efficient design as it maximizes your instance's diversity. You can create a multitude of entities without overcrowding and without overlapping functionality. Nonetheless, as a best practice, promote reusability where possible. Keep in mind that a Dynamics 365 online instance has a limit on the number of custom entities that can be created. The limit also includes custom entities introduced by deploying third-party solutions. At the time of writing, the limit is 300 custom entities per Dynamics 365 instance. You can check your limit by navigating to Settings | Administration | Resources In Use:

Your new ER diagram is highlighted in the following screenshot:

The advantages of a completely normalized model are:

  • No coupling between entities, resulting in cleaner and easier to manage solutions
  • Full independent control using security roles for each of the entities
  • Positive user experience with clean independent forms
  • No need for complex configuration or customization to show and hide irrelevant sections

This model also has some cons, some of which are:

  • Search results will appear in different lists
  • Cannot combine views with both entities
  • Some out-of-the-box entities (contact, account, and activities, among others) have well-defined core structures that could be difficult to recreate (for example, the regarding field on activities).

See also

  • Modeling denormalized entities
  • Modeling normalized entities with a common parent
  • Using a Business Rule to show and hide attributes
  • The Building cumulative security roles recipe of Chapter 7, Security

Using a Business Rule to show and hide attributes

Business Rules are a Power User's dream come true. They minimize the amount of custom JavaScript required on forms and they can replace some simple calculation plugins when the rule is scoped at the entity level.

In this example, we will create a simple Business Rule to show and hide the Student Id attribute based on the contact types defined in the first recipe of this chapter.

Getting ready

Similar to the previous recipes, a System Customizer or higher security role is required to perform the configuration as well as a solution to contain the changes.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Navigate to Entities | Contact | Forms and open the previously created Contact form.
  3. Double-click on Contact Type and uncheck the Visible by default checkbox.
  4. Click on OK, then click on Save and Close.
  5. Navigate to Entities | Contact | Business Rules and click on New.
  6. Under BUSINESS RULE: Contact, enter the title, Show/Hide Student Id.
  7. Click on the first available CONDITION and enter the following details in the right pane:
    • Display Name: Check Contact Type Student
    • Source: Entity
    • Field: Contact Type
    • Operator: Equals
    • Type: Value
    • Value: Student
  8. Click on the Apply button.
  9. Back in the main editor, click on Add | Add Set Visibly and select the + sign adjacent to the tick sign: 

Enter the following details, followed by a click on Apply:

    • Display Name: Show Student Id
    • Field: Student Id
    • Status: Show field
  1. Back in the main editor again, click on Add | Add Condition and select the + sign adjacent to the X sign:

Enter the following details:

    • Display Name: Check Contact Type Other
    • Source: Entity
    • Field: Contact Type
    • Operator: Equals
    • Type: Value
    • Value: Other
  1. Click on Apply.
  1. Click on Add action | Add Set Visibility and select the + sign adjacent to the tick sign for the new condition:

Enter the following in the right-hand pane:

    • Display Name: Hide Student Id
    • Field: Student Id
    • Status: Hide field
  1. Click on Apply in the right navigation pane, followed by Save in the main editor in the top left:
  1. Once saved, click on Activate on the main editor followed by Activate in the Process Activate Confirmation prompt:
  1. You can optionally click on the VALIDATE button to ensure that your business rules do not have any issues.

How it works

We started by marking the field as hidden by default in step 3. As a best practice, it always makes for a better user experience when hidden fields are revealed, as opposed to hiding visible fields on loading a record. In step 7 and step 8, we created the condition and rule to show the field; in step 9 and step 10, we created the converse condition and rule to hide the field. Always think about the reverse scenario when implementing business rules, otherwise, you will be faced with an irreversible action.

Given that the scope of the business rule was set to the default All Forms (top-right corner when editing the business rule), all forms will now respect that rule. If the scope was set to Entity, the rule would also trigger on the server side, which could be useful if implementing calculation rules that need to be respected when manipulating the data outside of a form (for example editable grids, bulk import, or through the Web API or SDK):

Behind the scenes, JavaScript functionality is created to address the rules' requirements. This is also respected in all form factors following the configure once, deploy everywhere design pattern.

Business Rules also have limitations, as follows:

  • There is a limit of 10 If Else conditions per business rule
  • Business Rules cannot control sections and tabs
  • If not set to a scope of Entity, a Business Rule will only run on load and on changes to the field, not on save.
  • Conditions cannot be a mixture of AND and OR; it's a set of one or the other

For additional limitations, visit https://technet.microsoft.com/en-us/library/dn531086.

There's more...

Business Rules provide a wide range of actions that can be performed. Among them are the following:

  • Show error message
  • Set field value (using another field's value, a static value, a formula, or simply clear it; it's good for simple plugin replacements)
  • Set visibility
  • Set default value
  • Lock or unlock a field

The TechNet article (https://www.microsoft.com/en-us/Dynamics/crm-customer-center/create-business-rules-and-recommendations-to-apply-logic-in-a-form.aspx) covers more details about Business Rule.

Building a configurable e-mail notification workflow

Workflows are one of the most powerful no-code extensions you can configure in Dynamics 365; without any code, you can automate repetitive business processes.

Workflows are versatile and can fulfill a wide range of functionalities, ranging from creating entities and sending e-mails to calling actions. In this recipe, we will create a workflow that sends an e-mail to any new students after 24 hours of their record being created.

Getting ready

Similar to the previous recipe, a System Customizer or higher security role is required to perform the configuration as well as a solution to contain the changes.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Under Processes, click on New.
  3. Fill in the following details:
    • Process name: Send Student Welcome Email
    • Category: Workflow
    • Entity: Contact
    • Tick Run this workflow in the background
    • Type: New blank process
  4. In the Process editor tick Record is created and As an on-demand. Keep the rest as is with their default values.
  5. Click on Add Step | Wait Condition.
  6. Click on <condition> (click to configure) and select the following:
    • Process in the first column
    • Execution time in the second column
    • Equals in the third column
    • In the last column, use the form assistance on the right-hand side:
      1. Select 1 under Day
      2. Select After
      3. Look for Process
      4. Double click Execution Time in the last list
  1. Click on Save and Close.
  2. Back in your process, click on Select this row and click Add Step, then click on Add Step | Check condition.
  3. Click on <condition> (click to configure) and enter the following details:
  • Contact, Email, and Contains Data
  • Contact, Contact Type, Equals, and Student (created in the previous recipe)
  • Contact, Status, Equals, and Active
  • Click on Save and Close:
  1. Click on Select this row and click Add Step, followed by Add Step | Send Email.
  2. Select Create New Message from the drop-down and click on Set Properties.
  3. Enter the details of the e-mail as follows:
  • From: <your name>
  • To: using Form Assistance on the right, select Contact under Look for followed by Contact from the next dropdown, then click on the Add button followed by the OK button at the bottom:
    • Enter Welcome to Packt University in the Subject Line option
    • Enter Hi
    • Using the right Form Assistance, select Contact, Last Name, and click on Add, then OK
    • Follow the salutation with a carriage return (Enter) and Welcome to Packt University
  1. Save and Close the dialog.
  1. Click on Activate at the top of the workflow:

How it works...

In step 2 to step 4, we created a workflow that triggers on creation (when the contact record is first created, the workflow will start waiting). The workflow can also be called on demand in case we want to trigger it again. In this example, the contact might already be created but not as a Student. Once the contact is set as a Student, the workflow can be triggered manually to send the welcome e-mail.

In step 5 and step 6, we set up the wait condition to wait for a day.

In step 7 and step 8, we checked if the contact is an active student with an e-mail address.

In step 9 to step 12, we created a personalized e-mail for the contact and welcomed them.

In step 13, we activated the workflow.

As a good practice, always add descriptions to your workflow, and to each step, to understand at a high level what the workflow is doing.

When asynchronous workflows are triggered, they enter into a pool to be processed when the asynchronous service is free. Asynchronous workflows are typically executed within seconds or minutes. If the execution is taking hours, then you might want to raise a support ticket with Microsoft to investigate. Executing workflows asynchronously is a great way to lighten the load on your Dynamics instances.

When workflows instances are waiting for a condition to be satisfied, they do not consume resources or affect your instance's performance. However, it is generally agreed by the community that it is a bad practice to have too many workflow instances in a waiting status.

There's more

In more recent releases, synchronous workflows that turn your workflow into a configurable plugin became available. Microsoft does not recommend synchronous workflows for long processes due to the load that is associated with them. Furthermore, online instances have a limit of 2 minutes per synchronous workflow or plugin. Nevertheless, synchronous workflows are there to be used. Use them wisely.

See also

  • The Creating your first custom workflow activity recipe of Chapter 4, Server-Side Extensions

Building your first action

Have you ever wanted to call a workflow from your JavaScript? If you have, then you will be pleased to learn about Actions. Actions, introduced with Dynamics CRM 2013, are yet another great addition to the configurable extensions. It was created to allow a business logic to be called from within workflows, as well as from JavaScript and Plugin customization.

Actions can be built using a point and click interface, as well as using .NET code. In this recipe, we will create a configured action that takes a few string values, creates a student record, and returns that record as an output parameter.

Getting ready

Similar to the previous recipes, a System Customizer or higher security role is required to perform the configuration as well as a solution to contain the changes.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Under Processes, click on New.
  3. Fill in the following details:
    • Process name: Create Student
    • Category: Action
    • Entity: None (global)
  4. Click on OK.
  5. Click on the + button below Hide Process Arguments and add the following four arguments:
    • Name: FirstName, Type: String, and Direction: Input
    • Name: LastName, Type: String, and Direction: Input
    • Name: EmailAddress, Type: String, and Direction: Input
    • Name: CreatedStudent, Type: EntityReference, Entity: Contact, and Direction: Output
  6. Click on Add Step | Create Record.
  7. In the drop-down next to create, select Contact and click on Set Properties.
  1. Enter the following details:
    • First Name: From the right form assistance, select Arguments in the Look For dropdown, followed by FirstName in the drop down, click on Add, and then OK
    • Last Name: From the right form assistance, select Arguments in the Look For dropdown, followed by LastName in the drop down, click on Add, and then OK
    • Email Address: From the right form assistance, select Arguments in the Look For dropdown, followed by EmailAddress in the dropdown, click on Add, and then OK
    • Contact Type: Student
  2. Click on Save and Close.
  3. Click on Add Step | Assign Value.
  4. Select Set Properties next to Assign Value.
  5. Enter the following details:
    • Statement Label:  Assign a created student
    • Name: Created student
    • Go to Value from the right-hand Form Assistance and select Create (Contact) from the Look For dropdown and Contact from the next drop down
    • Click on Add and OK, and then Save and Close
  1. Click on Activate and then Save and Close:

How it works...

In step 2 and step 3, we created the blank action. We ensured that the action's entity is set to None (global), meaning that the process is not bound to any entities (the way workflows are).

In step 4, we created three input parameters and one output parameter.

In step 5 to step 7, we created the student contact record using the input parameters.

In step 8 to step 10, we assigned the created record to the output parameter.

In step 11, we activated the process.

As mentioned previously, actions can be called from workflows, JavaScript, Plugins, or using the Dynamics 365 web services. Every time an action is created, Dynamics 365 creates a message that can be called externally. In the Creating your first custom action recipe in Chapter 4, Server-Side Extensions, you will learn how to generate early-bound types for actions to call using managed .NET code.

Microsoft recommends naming your action using a verb describing what the action is about to ensure your application's vocabulary is something that makes sense from a business flow perspective.

For more information about actions, visit https://technet.microsoft.com/en-us/library/dn531060.aspx.

See also

The Creating your first custom action recipe of Chapter 4, Server-Side Extensions

Setting up the rollup fields

Rollup fields are one of the most exciting new features that were introduced in recent years that significantly reduced the amount of custom code required. Rollup fields can aggregate values from other attributes. You can calculate sums, averages, minimums, maximums, and counts.

In this recipe, we will create a rollup field that counts how many active activities are associated with a contact.

Getting ready

Similar to the previous recipes, a System Customizer or higher security role is required to perform the configuration as well as a solution to contain the changes.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Create a new field by clicking on Entity | Contact | Fields | New and enter the following details:
    • Display Name: Number of Activities
    • Data Type: Whole Number
    • Field Type: Rollup
  3. Click on Edit next to the Field Type dropdown.
  4. In the Rollup Field dialog, under Related Entity, select Activities (Regarding) and click the tick box.
  5. In the Filters section, select the following:
    • Activity Status under Field
    • Equals under Operator
    • Value under Type
    • Check Open and Scheduled under Value
  6. Click on the tick box.
  7. Under Aggregation, select the following:
    • Aggregate Function under Count
    • Activity under Aggregated Related Entity field
  8. Click on the tick box. Your ROLLUP FIELD dialog will look as follows:
  1. Click on Save and Close on the ROLLUP FIELD dialog and the attribute dialogue.
  2. Click on the Publish All Customizations button for your solution.

How it works...

In step 2 to step 7, we created a new rollup field of type whole number that calculates the total count of active activities associated with a contact.

A couple of things to note about rollup fields: the fields are read-only and the calculation does not take into account a user's security roles.

Frequency

When a rollup field is created, behind the scenes, a system asynchronous job is scheduled to execute 12 hours after the field is created. Navigate to Settings | System Jobs; you will see a job of type Mass Calculate Rollup field with the name of your new field in System Job Name. You can force the job to run sooner by clicking on Action | Postpone and entering an earlier date/time. It is not recommended to do so when you have a large number of records in a production environment. The first time the job runs, it will have to update all fields, which might lead to a performance impact.

Subsequently, the System Jobs option will have a Calculated Rollup field per entity that has rollup fields configured. By default, subsequent rollup field calculations will take place every hour, (which is the fastest schedule). If an hourly update is not necessary, you can update the value by double-clicking on the System Job option, and selecting Actions | Modify Recurrence. This will present a dialog box that helps you redefine the recurrence of the execution:

Given that the rollup fields are executed as asynchronous jobs, if the calculation is not occurring, consider checking the status of the asynchronous service. For on-premise installation, log on to your backend server and check its status. For online implementations, log a support call with Microsoft to check the status of the service.

Programmatic Rollup Field execution

On top of the automated schedules, rollup fields can also be executed programmatically by executing CalcualteRollupFieldRequest. Furthermore, if you search online for "rollup field workflow", you will find custom workflow activities built by the community to force recalculations in your configurable workflows.

There's more...

Rollup fields are a powerful feature in Dynamics 365. On top of the counting capability described in this recipe, rollup fields offer other types of aggregations. Furthermore, in some cases (activities), the aggregation can span across multiple relationship levels.

Different types of aggregation

Counting the number of records is one of the many capabilities of a rollup field. You can also get the maximum, minimum, average, and sum of a field, assuming the field type allows it. As you select a different aggregate function, the entity fields will be filtered accordingly.

Indirectly related activities

Given that our rollup field is aggregating activities, the field can also include indirectly related activities by defining Activity Parties (activities) under indirectly related activities. This will expand the aggregation, not only when the contact is in the regarding field, but also in the parties field.

For more details about rollup fields, visit https://technet.microsoft.com/en-nz/library/dn832162.aspx.

See also

  • Setting up calculated fields

Setting up calculated fields

Similar to rollups fields, calculated fields are another recent addition to Dynamics 365's configuration capabilities that significantly reduces the need for custom code extensions.

As the name suggests, calculated fields allow you to set the value of an attribute based on another field, a function, or a formula. Furthermore, calculated fields may trigger based on a set of conditions.

In this example, we will configure a field to calculate the difference in months between two dates: (student start date, and student end date).

Getting ready

Similar to the previous recipes, a System Customizer or higher security role is required to perform the configuration as well as a solution to contain the changes.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Create two new fields by clicking on Entity | Contact | Fields | New as follows:
    • Start Date of type Date Time
    • End Date of type Date Time
  3. Create a new Calculated field and enter the following details:
    • Display Name: Months for graduation
    • Data Type: Whole Number
    • Field Type: Calculated
  4. Click on Edit next to the Field Type drop-down.
  5. In the Calculated dialog under Condition (Optional), click on Add condition.
  1. In the If row, enter the following details and click on the tick box:
    • Entity: Current Entity (Contact)
    • Field: Contact Type
    • Operator: Equals
    • Type: Value
    • Value: Student
  2. Under Action, click on Add action, enter DIFFINMONTHS(packt_enddate, packt_startdate), and then click on the tick button:
  1. Click on Save and Close on the rollup field dialogue and the attribute dialogue.

How it works

In this recipe, we used a point and click configuration to set up a calculated field to calculate the number of months' difference between a graduate's start date and end date.

In step 5 and step 6, we defined the condition, and in step 7, we defined the calculation formula.

Calculated fields translate to synchronous server-side code executions. They are similar to plugins and are executed during stage 40 of the execution pipeline of a post update or create message.

Given that the execution takes place on the server side, the users will only see the changes right after a save event is triggered. Unlike business rules and JavaScript customization, the result is not instantaneous. They do not trigger after the condition is met on the form frontend.

Similar to rollup fields, calculated fields are read-only and do not take into account a user's security roles.

There's more...

Calculated fields are a powerful addition; they can be used in many scenarios, some of which are:

  • Number calculations, (for accounting, weights, and so on)
  • Retrieving values from related entities
  • Constructing a string based on other attributes

The TechNet article (https://technet.microsoft.com/library/dn832103.aspx) covers calculated fields in a few examples. The article also covers some limitations of calculated fields. Among them are the following:

  • Calculated fields cannot trigger a plugin or workflows
  • Once a field is created as simple, you cannot convert it to a calculated field without deleting it; (something to consider when upgrading old versions)
  • A calculated field cannot reference itself, but it can reference another calculated field or rollup field (limit of five chained fields)
  • Values in the calculated formula can come from the current entity or a direct parent (no access to 1:N or N:N entities)
  • Up to 10 unique calculated fields can be used in saved queries, charts, and visualizations
  • You cannot define a maximum or minimum metadata property on a calculated field

At the time of writing, in addition to basic arithmetic operations, the Dynamics 365 supports the following built-in formulas with their respective return types:

Function syntax

Return type

ADDDAYS (whole number, date and time)

Date and Time

ADDHOURS (whole number, date and time)

Date and Time

ADDMONTHS (whole number, date and time)

Date and Time

ADDWEEKS (whole number, date and time)

Date and Time

ADDYEARS (whole number, date and time)

Date and Time

SUBTRACTDAYS (whole number, date and time)

Date and Time

SUBTRACTHOURS (whole number, date and time)

Date and Time

SUBTRACTMONTHS (whole number, date and time)

Date and Time

SUBTRACTWEEKS (whole number, date and time)

Date and Time

SUBTRACTYEARS (whole number, date and time)

Date and Time

DIFFINDAYS (date and time, date and time)

Whole Number

DIFFINHOURS (date and time, date and time)

Whole Number

DIFFINMINUTES (date and time, date and time)

Whole Number

DIFFINMONTHS (date and time, date and time)

Whole Number

DIFFINWEEKS (date and time, date and time)

Whole Number

DIFFINYEARS (date and time, date and time)

Whole Number

CONCAT (single line of text, single line of text, ... single line of text)

String

TRIMLEFT (single line of text, whole number)

String

TRIMRIGHT (single line of text, whole number)

String

See also

  • Setting up the rollup fields

Duplicate detection using alternate keys

Duplicate detection has been around since the early versions of Dynamics CRM. In 2015, alternate keys were introduced to help identify a record based on a unique combination of attributes to perform an upsert request. An upsert is the action of inserting a record if it is new, or updating it if it already exists, based on the primary key identifier (https://msdn.microsoft.com/en-us/library/dn932135.aspx). Logically, this means whenever an alternate key is defined, any new records that are created with the same key combination will throw a duplicate exception.

This recipe will walk us though defining an alternate key for a contact, and testing the duplicate detection.

Getting ready

Similar to the previous recipes, a System Customizer or higher security role is required to perform the configuration as well as a solution to contain the changes.

How to do it

  1. Navigate to Settings | Solutions | Packt.
  2. Create a new field by clicking on Entity | Contact | Keys | New.
  3. In the Key definition dialogue, type Name and Email in the Display Name field.
  4. Double-click on the First Name, Last Name, and Email Address fields under Available Attributes:
  1. Click on Save and Close.
  1. Navigate to contacts and try creating two contacts with the same first name, last name, and e-mail address. You will be prompted with the Duplicate Record error, as shown in the following screenshot:

How it works

In step 2 to step 5, we created an alternate key using First Name, Last Name, and Email on an individual. In step 6, we tested the duplicate detection by creating two records with the same key combination.

Alternate keys have a similar behaviour to conventional duplicate detection, except the check happens at a lower level in the database (a unique nonclustered index). Additionally, if a duplicate is detected, primary keys will strictly stop a duplicate from being created, whereas, conventional duplicate detection functionality gives you the option to create it nonetheless. This is particularly important if you want to stop duplicates when using different channels than the frontend forms.

Behind the scenes, Dynamics CRM is creating a nonclustered unique index using the three fields defined in the key. If you have an on-premise deployment, you can run a SQL profiler to intercept commands that are executed on the database. A query similar to the following one will appear in your list:

CREATE UNIQUE INDEX [ndx_for_entitykey_packt_NameandEmail]
ON [ContactBase]
([EMailAddress1] ASC, [FirstName] ASC, [LastName] ASC)
INCLUDE ([ContactId])
WHERE [EMailAddress1] is not null
AND [FirstName] is not null
AND [LastName] is not null
WITH (FILLFACTOR = 80, MAXDOP = 4, SORT_IN_TEMPDB = ON)

The preceding query creates a unique nonclustered index on the ContactBase (the contact table) on the three columns: FirstName, LastName, and EmailAddress1. For more information on nonclustered indexes, read the following article at https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-nonclustered-indexes

During the duplicate detection process, if a field has an empty value (translated to NULL in the database) in one of the fields, the record will not be identified as a duplicate.

Note that alternate key creation can fail sometimes. Always check, after creating your key, whether the creation has been successful. If a duplicate already exists in your dataset, the key creation will fail. To check the status of a newly created key, in your solution, navigate to Entities | <your entity> | Keys and ensure the Status column states Active. If the creation fails, it will state Failed:

Left arrow icon Right arrow icon
Download code icon Download Code

Key benefits

  • Customize, configure, and extend the vanilla features of Dynamics 365 to deliver bespoke CRM solutions fit for any organization
  • Implement business logic using point-and-click configuration, plugins, and client-side scripts with MS Dynamics 365
  • Built a DevOps pipeline as well as Integrate Dynamics 365 with Azure and other platforms

Description

Microsoft Dynamics 365 is a powerful tool. It has many unique features that empower organisations to bridge common business challenges and technology pitfalls that would usually hinder the adoption of a CRM solution. This book sets out to enable you to harness the power of Dynamics 365 and cater to your unique circumstances. We start this book with a no-code configuration chapter and explain the schema, fields, and forms modeling techniques. We then move on to server-side and client-side custom code extensions. Next, you will see how best to integrate Dynamics 365 in a DevOps pipeline to package and deploy your extensions to the various SDLC environments. This book also covers modern libraries and integration patterns that can be used with Dynamics 365 (Angular, 3 tiers, and many others). Finally, we end by highlighting some of the powerful extensions available. Throughout we explain a range of design patterns and techniques that can be used to enhance your code quality; the aim is that you will learn to write enterprise-scale quality code.

Who is this book for?

This book is for developers, administrators, consultants, and power users who want to learn about best practices when extending Dynamics 365 for enterprises. You are expected to have a basic understand of the Dynamics CRM/365 platform.

What you will learn

  • Customize, configure, and extend Microsoft Dynamics 365
  • Create business process automation
  • Develop client-side extensions to add features to the Dynamics 365 user interface
  • Set up a security model to securely manage data with Dynamics 365
  • Develop and deploy clean code plugins to implement a wide range of custom behaviors
  • Use third-party applications, tools, and patterns to integrate Dynamics 365 with other platforms
  • Integrate with Azure, Java, SSIS, PowerBI, and Octopus Deploy
  • Build an end-to-end DevOps pipeline for Dynamics 365
Estimated delivery fee Deliver to Switzerland

Standard delivery 10 - 13 business days

€11.95

Premium delivery 3 - 6 business days

€16.95
(Includes tracking information)

Product Details

Country selected
Publication date, Length, Edition, Language, ISBN-13
Publication date : Jun 07, 2017
Length: 462 pages
Edition : 1st
Language : English
ISBN-13 : 9781786464170
Vendor :
Microsoft
Languages :
Concepts :
Tools :

What do you get with Print?

Product feature icon Instant access to your digital eBook copy whilst your Print order is Shipped
Product feature icon Paperback book shipped to your preferred address
Product feature icon Download this book in EPUB and PDF formats
Product feature icon Access this title in our online reader with advanced features
Product feature icon DRM FREE - Read whenever, wherever and however you want
OR
Modal Close icon
Payment Processing...
tick Completed

Shipping Address

Billing Address

Shipping Methods
Estimated delivery fee Deliver to Switzerland

Standard delivery 10 - 13 business days

€11.95

Premium delivery 3 - 6 business days

€16.95
(Includes tracking information)

Product Details

Publication date : Jun 07, 2017
Length: 462 pages
Edition : 1st
Language : English
ISBN-13 : 9781786464170
Vendor :
Microsoft
Languages :
Concepts :
Tools :

Packt Subscriptions

See our plans and pricing
Modal Close icon
€18.99 billed monthly
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Simple pricing, no contract
€189.99 billed annually
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Choose a DRM-free eBook or Video every month to keep
Feature tick icon PLUS own as many other DRM-free eBooks or Videos as you like for just €5 each
Feature tick icon Exclusive print discounts
€264.99 billed in 18 months
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Choose a DRM-free eBook or Video every month to keep
Feature tick icon PLUS own as many other DRM-free eBooks or Videos as you like for just €5 each
Feature tick icon Exclusive print discounts

Frequently bought together


Stars icon
Total 141.97
Microsoft Dynamics 365 Extensions Cookbook
€45.99
Dynamics 365 for Finance and Operations Development Cookbook
€49.99
Extending Microsoft Dynamics 365 for Operations Cookbook
€45.99
Total 141.97 Stars icon
Banner background image

Table of Contents

11 Chapters
No Code Extensions Chevron down icon Chevron up icon
Client-Side Extensions Chevron down icon Chevron up icon
SDK Enterprise Capabilities Chevron down icon Chevron up icon
Server-Side Extensions Chevron down icon Chevron up icon
External Integration Chevron down icon Chevron up icon
Enhancing Your Code Chevron down icon Chevron up icon
Security Chevron down icon Chevron up icon
DevOps Chevron down icon Chevron up icon
Dynamics 365 Extensions Chevron down icon Chevron up icon
Architectural Views Chevron down icon Chevron up icon
Dynamics 365 Chevron down icon Chevron up icon

Customer reviews

Top Reviews
Rating distribution
Full star icon Full star icon Full star icon Half star icon Empty star icon 3.8
(6 Ratings)
5 star 66.7%
4 star 0%
3 star 0%
2 star 16.7%
1 star 16.7%
Filter icon Filter
Top Reviews

Filter reviews by




Leo Pham Nov 12, 2017
Full star icon Full star icon Full star icon Full star icon Full star icon 5
Great book for any crm developer and architect. Good overview in different approaches of extending Dynamics CRM and 365. I really enjoy the "Enhancing Your Code" chapter which contains very useful & practical ideas and code samples even with 3 layers approach but you can extend it to a DDD (Domain-Driven Design).As I really were reading and enjoying the book. I have double-checked and found out that Rami Mounla was awarded the Microsoft CRM MVP in 2015.
Amazon Verified review Amazon
Juan Carlos Aguilar Oct 19, 2017
Full star icon Full star icon Full star icon Full star icon Full star icon 5
interesting
Amazon Verified review Amazon
BERNARDO A CETZAL IX Oct 06, 2018
Full star icon Full star icon Full star icon Full star icon Full star icon 5
Contenido directo sin tanto rodeo, facil de seguir para realizar pruebas de concepto.
Amazon Verified review Amazon
Jeremiah Bullfrog Mar 08, 2021
Full star icon Full star icon Full star icon Full star icon Full star icon 5
As a Dynamics CRM developer with a decade of experience, starting with CRM 4.0, this is the first book I have found that is written at a code-based (incl. SDK) "developer level."The JavaScript uses the old Xrm.Page model, but that constitutes a small part of the book and can easily be translated into the new executionContext/formContext-based code used by the newer Customer Engagement (9.x) version.The examples given are at exactly the right level of detail and complexity to demonstrate the proof of concept for each digestible-sized "recipe." And more than just a cookbook of unrelated recipes, the proof-of-concept components accumulate into near real-world examples of things like integration with the Azure Service Bus.The chapter on "Refactoring your plugin using a three-layer pattern" is especially excellent, and essential knowledge for doing unit-testing of plugins (via Moq and XrmUnitTest, with examples of each being given in the book).The second half of the book contains much less code (aside from a few PowerShell scripts), covering subjects like security roles, solutions, deployment, Power Apps, Power BI, Flow, and the Common Data Service.The text contains a few minor typos, but they don't distract from understanding the material.Overall, this is an excellent (and perhaps the only?) book to introduce the intermediate Dynamics CRM developer to code-based functionality and possibilities that exist on the next-higher level of expertise--including some insights into the "under the hood" behaviors of CRM, gleaned from using SQL Server Profiler on an on-premise installation; and links for specific further exploration online in the free MSDN/TechNet documentation provided by Microsoft, which can be a bit overwhelming if you have no particular place to start.It's not an inexpensive book, but it's totally worth the investment if you're in the target audience. I'm delighted to have found it, and expect to be referring to it regularly in the future.
Amazon Verified review Amazon
Nived Varma Jun 07, 2018
Full star icon Full star icon Empty star icon Empty star icon Empty star icon 2
The book is very haphazard. Many technical mistakes are there. The explanation is just surface level. Recipes are not tested. The quality of code is just Hello world examples. Selection of example is very poor.
Amazon Verified review Amazon
Get free access to Packt library with over 7500+ books and video courses for 7 days!
Start Free Trial

FAQs

What is the delivery time and cost of print book? Chevron down icon Chevron up icon

Shipping Details

USA:

'

Economy: Delivery to most addresses in the US within 10-15 business days

Premium: Trackable Delivery to most addresses in the US within 3-8 business days

UK:

Economy: Delivery to most addresses in the U.K. within 7-9 business days.
Shipments are not trackable

Premium: Trackable delivery to most addresses in the U.K. within 3-4 business days!
Add one extra business day for deliveries to Northern Ireland and Scottish Highlands and islands

EU:

Premium: Trackable delivery to most EU destinations within 4-9 business days.

Australia:

Economy: Can deliver to P. O. Boxes and private residences.
Trackable service with delivery to addresses in Australia only.
Delivery time ranges from 7-9 business days for VIC and 8-10 business days for Interstate metro
Delivery time is up to 15 business days for remote areas of WA, NT & QLD.

Premium: Delivery to addresses in Australia only
Trackable delivery to most P. O. Boxes and private residences in Australia within 4-5 days based on the distance to a destination following dispatch.

India:

Premium: Delivery to most Indian addresses within 5-6 business days

Rest of the World:

Premium: Countries in the American continent: Trackable delivery to most countries within 4-7 business days

Asia:

Premium: Delivery to most Asian addresses within 5-9 business days

Disclaimer:
All orders received before 5 PM U.K time would start printing from the next business day. So the estimated delivery times start from the next day as well. Orders received after 5 PM U.K time (in our internal systems) on a business day or anytime on the weekend will begin printing the second to next business day. For example, an order placed at 11 AM today will begin printing tomorrow, whereas an order placed at 9 PM tonight will begin printing the day after tomorrow.


Unfortunately, due to several restrictions, we are unable to ship to the following countries:

  1. Afghanistan
  2. American Samoa
  3. Belarus
  4. Brunei Darussalam
  5. Central African Republic
  6. The Democratic Republic of Congo
  7. Eritrea
  8. Guinea-bissau
  9. Iran
  10. Lebanon
  11. Libiya Arab Jamahriya
  12. Somalia
  13. Sudan
  14. Russian Federation
  15. Syrian Arab Republic
  16. Ukraine
  17. Venezuela
What is custom duty/charge? Chevron down icon Chevron up icon

Customs duty are charges levied on goods when they cross international borders. It is a tax that is imposed on imported goods. These duties are charged by special authorities and bodies created by local governments and are meant to protect local industries, economies, and businesses.

Do I have to pay customs charges for the print book order? Chevron down icon Chevron up icon

The orders shipped to the countries that are listed under EU27 will not bear custom charges. They are paid by Packt as part of the order.

List of EU27 countries: www.gov.uk/eu-eea:

A custom duty or localized taxes may be applicable on the shipment and would be charged by the recipient country outside of the EU27 which should be paid by the customer and these duties are not included in the shipping charges been charged on the order.

How do I know my custom duty charges? Chevron down icon Chevron up icon

The amount of duty payable varies greatly depending on the imported goods, the country of origin and several other factors like the total invoice amount or dimensions like weight, and other such criteria applicable in your country.

For example:

  • If you live in Mexico, and the declared value of your ordered items is over $ 50, for you to receive a package, you will have to pay additional import tax of 19% which will be $ 9.50 to the courier service.
  • Whereas if you live in Turkey, and the declared value of your ordered items is over € 22, for you to receive a package, you will have to pay additional import tax of 18% which will be € 3.96 to the courier service.
How can I cancel my order? Chevron down icon Chevron up icon

Cancellation Policy for Published Printed Books:

You can cancel any order within 1 hour of placing the order. Simply contact customercare@packt.com with your order details or payment transaction id. If your order has already started the shipment process, we will do our best to stop it. However, if it is already on the way to you then when you receive it, you can contact us at customercare@packt.com using the returns and refund process.

Please understand that Packt Publishing cannot provide refunds or cancel any order except for the cases described in our Return Policy (i.e. Packt Publishing agrees to replace your printed book because it arrives damaged or material defect in book), Packt Publishing will not accept returns.

What is your returns and refunds policy? Chevron down icon Chevron up icon

Return Policy:

We want you to be happy with your purchase from Packtpub.com. We will not hassle you with returning print books to us. If the print book you receive from us is incorrect, damaged, doesn't work or is unacceptably late, please contact Customer Relations Team on customercare@packt.com with the order number and issue details as explained below:

  1. If you ordered (eBook, Video or Print Book) incorrectly or accidentally, please contact Customer Relations Team on customercare@packt.com within one hour of placing the order and we will replace/refund you the item cost.
  2. Sadly, if your eBook or Video file is faulty or a fault occurs during the eBook or Video being made available to you, i.e. during download then you should contact Customer Relations Team within 14 days of purchase on customercare@packt.com who will be able to resolve this issue for you.
  3. You will have a choice of replacement or refund of the problem items.(damaged, defective or incorrect)
  4. Once Customer Care Team confirms that you will be refunded, you should receive the refund within 10 to 12 working days.
  5. If you are only requesting a refund of one book from a multiple order, then we will refund you the appropriate single item.
  6. Where the items were shipped under a free shipping offer, there will be no shipping costs to refund.

On the off chance your printed book arrives damaged, with book material defect, contact our Customer Relation Team on customercare@packt.com within 14 days of receipt of the book with appropriate evidence of damage and we will work with you to secure a replacement copy, if necessary. Please note that each printed book you order from us is individually made by Packt's professional book-printing partner which is on a print-on-demand basis.

What tax is charged? Chevron down icon Chevron up icon

Currently, no tax is charged on the purchase of any print book (subject to change based on the laws and regulations). A localized VAT fee is charged only to our European and UK customers on eBooks, Video and subscriptions that they buy. GST is charged to Indian customers for eBooks and video purchases.

What payment methods can I use? Chevron down icon Chevron up icon

You can pay with the following card types:

  1. Visa Debit
  2. Visa Credit
  3. MasterCard
  4. PayPal
What is the delivery time and cost of print books? Chevron down icon Chevron up icon

Shipping Details

USA:

'

Economy: Delivery to most addresses in the US within 10-15 business days

Premium: Trackable Delivery to most addresses in the US within 3-8 business days

UK:

Economy: Delivery to most addresses in the U.K. within 7-9 business days.
Shipments are not trackable

Premium: Trackable delivery to most addresses in the U.K. within 3-4 business days!
Add one extra business day for deliveries to Northern Ireland and Scottish Highlands and islands

EU:

Premium: Trackable delivery to most EU destinations within 4-9 business days.

Australia:

Economy: Can deliver to P. O. Boxes and private residences.
Trackable service with delivery to addresses in Australia only.
Delivery time ranges from 7-9 business days for VIC and 8-10 business days for Interstate metro
Delivery time is up to 15 business days for remote areas of WA, NT & QLD.

Premium: Delivery to addresses in Australia only
Trackable delivery to most P. O. Boxes and private residences in Australia within 4-5 days based on the distance to a destination following dispatch.

India:

Premium: Delivery to most Indian addresses within 5-6 business days

Rest of the World:

Premium: Countries in the American continent: Trackable delivery to most countries within 4-7 business days

Asia:

Premium: Delivery to most Asian addresses within 5-9 business days

Disclaimer:
All orders received before 5 PM U.K time would start printing from the next business day. So the estimated delivery times start from the next day as well. Orders received after 5 PM U.K time (in our internal systems) on a business day or anytime on the weekend will begin printing the second to next business day. For example, an order placed at 11 AM today will begin printing tomorrow, whereas an order placed at 9 PM tonight will begin printing the day after tomorrow.


Unfortunately, due to several restrictions, we are unable to ship to the following countries:

  1. Afghanistan
  2. American Samoa
  3. Belarus
  4. Brunei Darussalam
  5. Central African Republic
  6. The Democratic Republic of Congo
  7. Eritrea
  8. Guinea-bissau
  9. Iran
  10. Lebanon
  11. Libiya Arab Jamahriya
  12. Somalia
  13. Sudan
  14. Russian Federation
  15. Syrian Arab Republic
  16. Ukraine
  17. Venezuela