Category Archives: Uncategorized
A Hands-on Guide to Managing Inventory with Microsoft Dynamics 365 Business Central
Inventory is the core of many businesses. Whether you’re selling products, making goods, or managing a supply chain, keeping the right stock at the right time is key. Microsoft Dynamics 365 Business Central helps businesses handle inventory with ease and clarity. 1. Central Item List Item lists are the backbone of inventory management. Business Central lets you create a structured list of all your products—whether you buy them, sell them, or just store them. This organized list becomes the single source of truth across all departments. 2. Real-Time Inventory Levels Business Central keeps track of: This helps businesses plan better and fulfill orders faster without confusion. 3. Multi-Location Tracking If you manage inventory in multiple places (like stores, warehouses, or branches), Business Central supports that too. You can: 4. Reorder and Stock Planning With built-in reorder logic, Business Central tells you when to buy and how much to buy. It considers: This reduces guesswork and supports a smooth procurement process. 5. Purchase and Sales Integration When a purchase order is received or a sales order is shipped, inventory updates automatically. This minimizes the need for manual updates and keeps everyone on the same page. 6. Lot and Serial Number Tracking Business Central supports lot numbers and serial numbers. This helps with: 7. Inventory Valuation Methods You can choose how to value your inventory: This supports accurate financial reporting and cost control. 8. Inventory Transfers Do you need to move items from one location to another? Use transfer orders. You can record: 9. Inventory Adjustments Sometimes physical counts don’t match system data. Business Central allows easy stock corrections for: 10. Reports and Insights With built-in reports and dashboards, you can track: These insights will assist you in making well-informed decisions and planning ahead. Why It Matters Good inventory management helps you: Business Central gives you the tools to manage stock simply and efficiently. If you’re using spreadsheets or disconnected tools to manage inventory, now is a good time to explore Business Central. It gives you more control, better insights, and smoother operations—all in one place. We hope you found this blog useful. If you would like to discuss anything, you can reach out to us at transform@cloudfronts.com.
Share Story :
Automated Email Reminders Based on Date Fields in Power Automate for Dynamics 365 CRM.
Managing reminders and deadlines can be tricky, especially when you’re juggling multiple tasks in Dynamics 365. But what if you could set up automatic email reminders based on specific dates? In this guide, I’ll show you how to use Power Automate with D365 CRM to send automatic email reminders when certain dates are entered, and follow up at 7, 14, 21, and 28-day intervals if another related date field isn’t filled. By the end of this post, you’ll learn how to create a simple workflow that keeps your team on track by sending timely reminders when needed. The Use-Case: Automatic Email Reminders for Unfilled Dates Imagine this: Your Project Manager fills in a date for a project milestone. But if the next milestone isn’t updated after a set period, your system will automatically send reminder emails to the right people. This saves your team from having to manually follow up and ensures that important dates are never overlooked. Here’s how you can set it up using Power Automate: Key Components of the Solution Follow the Power Automate step outlined below: Select the “When a row is added, modified or deleted” trigger from the Dataverse connector, set the Change Type to Modified, choose the Order Fulfillments table, set the Scope to Organization, specify the columns cf_submittalprotocolprocess and cf_initialshopdrawingssubmitted to trigger only on changes to those fields, and optionally use the Filter Rows field to apply additional conditions if needed. Click the ellipsis (three dots) on the top-right corner of the trigger card, select Settings, scroll to the Trigger Conditions section, and enter the following expression to ensure the flow only triggers when cf_initialshopdrawingssubmitted is not empty: Below is the condition that you need to add: @and( not(empty(triggerOutputs()?[‘body/cf_initialshopdrawingssubmitted’])), equals(triggerOutputs()?[‘body/cf_submittalprotocolprocess’],979570001) ) Add the “Get a row by ID” action from the Dataverse connector, set the Table Name to Opportunities, and use the dynamic value Opportunity (Value) for the Row ID to retrieve the corresponding Opportunity record related to the modified Order Fulfillment. Add the “Get a row by ID” action from the Dataverse connector, set the Table Name to Order Fulfillments, and use the dynamic value Order Fulfillment for the Row ID to retrieve full details of the modified Order Fulfillment record. Add a “Compose” action named Comments for Email, and provide a formatted list including Project Manager (Order Fulfillment), Opportunity Contact, Secondary Contact, a static email (e.g., testblog@gmail.com), and again Project Manager (Order Fulfillment) as an example. Add a “Filter array” action, set the From field to a coalesce(…) expression generating a list of participants, and in Basic Mode set the condition to Item is not equal to null to remove null entries. Use a coalesce(createArray(…)) expression to conditionally construct an array of activity parties based on field availability (Opportunity Contact, Secondary Contact, Owner ID, Project Manager), falling back to a default address (CRMAdmin@gmail.com) if the Project Manager is null. coalesce( createArray( if( not(equals(outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value’], null)), json(concat( ‘{“participationtypemask”: 2,”partyid@odata.bind”: “contacts(‘, outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value’], ‘)”}’ )), null ), if( not(equals(triggerOutputs()?[‘body/_ow_secondarycontact_value’], null)), json(concat( ‘{“participationtypemask”: 2,”partyid@odata.bind”: “contacts(‘, triggerOutputs()?[‘body/_ow_secondarycontact_value’], ‘)”}’ )), Null ), if( not(equals(triggerOutputs()?[‘body/_ownerid_value’], null)), json(concat( ‘{“participationtypemask”: 3,”addressused”: “testblog@gmail.com”}’ )), null ), json(concat( ‘{“participationtypemask”: 4,”partyid@odata.bind”: “systemusers(‘, outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], ‘)”}’ )), if( not(equals(outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], null)), json(concat( ‘{“participationtypemask”: 1,”partyid@odata.bind”: “systemusers(‘, outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], ‘)”}’ )), json(concat( ‘{“participationtypemask”: 1,”addressused”: “CRMAdmin@gmail.com”}’ )) ) )) Switch to Advanced Mode in the Filter array and use the expression @not(equals(item(), null)) for better control over null filtering of the dynamic participant list. In the step below, I used a “Compose” action to extract the Project Manager’s ID, which is then used in the filter array step. Below is the body of the Filter Array, which I’ve saved in a new Compose action named “Email Participants.” Add a “Compose” action to generate the email body using HTML formatting, apply an if() expression to dynamically insert the recipient’s name, and use concat() to list the required items for fabrication. Below is the expression I used to identify all the recipients who will be receiving the emails. if( not(equals(outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value@OData.Community.Display.V1.FormattedValue’], null)), concat(‘<strong>’, outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value@OData.Community.Display.V1.FormattedValue’], ‘</strong>’), null After completing the previous steps, add a parallel branch with four parallel actions, each configured to send the email after a delay of 7, 14, 21, and 28 days, respectively. After introducing a 7-day delay, add a parallel branch that retrieves the corresponding Order Fulfillment record by ID and checks if both the Drawing Approval Date and Redline Issued Date fields updates have been made since the initial trigger Add the “Add a new row” action from the Dataverse connector, set the Table Name to Email Messages, populate the Activity Parties field using the dynamic output outputs(‘Email_Participants’), and map the Description field similarly with the appropriate output value containing the email body content. Set the Regarding (Order Fulfillments) field in the “Add a new row” action to the dynamic value Order Fulfilment (cf_orderfulfillment) to associate the email with the corresponding Order Fulfillment record. This is how the final power automate will look like Similarly, you can do for 14,21 and 28 days. Below is how the email would look like in CRM: The trigger will start when Initial shop drawings field contains the date field and Submittal/protocol process equals certain option. If both Redline Int Received and Drawing Approved Date fields remain empty after 7, 14, 21, and 28 days, CRM will automatically send a follow-up email on each of those days. This is how the email will look like. To conclude, setting up this automatic reminder system in Power Automate for D365 CRM will help your team stay on top of project milestones, reduce manual follow-ups, and make sure nothing gets overlooked. It’s a simple yet effective way to automate reminders and keep everyone informed without any extra effort. Hope this helps!!! We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com
Share Story :
Getting Started with OData Queries in Microsoft Dynamics 365
Have you ever needed to pull data out of Dynamics 365 but didn’t know where to begin? Whether you’re building a report, wiring up a Power App, or feeding data into another system, OData is your friend. In just a few clicks, you’ll be able to write simple HTTP requests to retrieve exactly the records you want—no complex code required. What Is OData and Why It Matters OData (Open Data Protocol) is a standardized way to query RESTful APIs. Microsoft Dynamics 365 exposes its entire data model via OData, so you can: This means faster development and fewer custom endpoints. 1. Finding Your Web API Endpoint https://yourorg.crm.dynamics.com/api/data/v9.2 That’s your base URL for every OData call. 2. Exploring Entities via Metadata Append $metadata to your base URL: GET https://yourorg.crm.dynamics.com/api/data/v9.2/$metadata You’ll get an XML file listing all entities (contacts, accounts, leads, etc.), their fields, data types, and navigation properties. Tip: press Ctrl + F to search for your entity by name. 3. Core OData Query Options a. $select – Return Only What You Need GET https://yourorg.crm.dynamics.com/api/data/v9.2/contacts?$select=fullname,emailaddress1,jobtitle This limits the payload to just those three fields, making responses smaller and faster. b. $filter – Narrow Down Your Results GET https://yourorg.crm.dynamics.com/api/data/v9.2//contacts?$filter=firstname eq ‘Ankit’ Operators: eq (equals) ne (not equals) gt / lt (greater than / less than) Combine with and / or : GET https://yourorg.crm.dynamics.com/api/data/v9.2//contacts?$filter=statecode eq 0 and jobtitle eq ‘Consultant’ c. $orderby – Sort Your Data GET https://yourorg.crm.dynamics.com/api/data/v9.2/contacts?$orderby=createdon desc Newest records appear first. d. $top – Limit Record Count GET https://yourorg.crm.dynamics.com/api/data/v9.2/contacts?$top=5 Great for previews or testing. e. $expand – Fetch Related Records Example: Get each contact’s full name and its parent account name in one request: GET https://yourorg.crm.dynamics.com/api/data/v9.2/contacts? $select=fullname,parentcustomerid &$expand=parentcustomerid_account($select=name) parentcustomerid is the lookup field parentcustomerid_account is the navigation property Nested $select limits expanded fields Another example: Expand opportunities with customer account info: GET https://yourorg.crm.dynamics.com/api/data/v9.2/opportunities?$expand=customerid_account($select=name,accountnumber) Finding Expandable Names In your $metadata, look for lines like: <NavigationProperty Name=”parentcustomerid_account” Type=”Microsoft.Dynamics.CRM.account” /> Use that Name value in your $expand. Putting It All Together Suppose you want all active contacts at “Contoso” and their account names: GET https://yourorg.crm.dynamics.com/api/data/v9.2/contacts?$filter=statecode eq 0 &$expand=parentcustomerid_account($filter=name eq ‘Contoso’; $select=name)&$select=fullname,emailaddress1 Conclusion: OData might sound technical at first, but once you get the hang of it, it becomes one of the most powerful tools in your Dynamics 365 toolbox. Whether you’re building integrations, reports, or simple automations, OData gives you the flexibility to query exactly what you need—without relying on custom development. Start small. Open your environment, locate the Web API URL, and try your first $select or $filter query. Once you’re confident, move on to advanced options like $expand and $orderby. Call to Action: Need help designing smarter OData-based solutions or integrating with Power Platform tools? Reach out to our team today and we’ll help you build something great.
Share Story :
Inventory Valuation – Month close Standard Operating Procedure (SOP)
Accurate inventory valuation is crucial for ensuring the financial integrity of any business using Microsoft Dynamics 365 Finance & Operations (D365 F&O). Companies with substantial inventory transactions must follow a structured approach to avoid discrepancies and ensure that profit and loss calculations are correctly reported. This Standard Operating Procedure (SOP) outlines the necessary steps to efficiently close inventory transactions, reconcile accounts, and maintain a reliable financial record. In Dynamics 365 Finance & Operations, companies having substantial inventory transactions should follow a certain set of rules so that the inventory valuation runs correctly and the Profit and loss for the company is worked out correctly. All the “Sales Orders” Having under this status shows Inventory Reserved this should be Un-reserved Before Closing All the “Transfer Orders” under this status should be should be Un-reserved Before Closing All the “journals” Under This Status Must Be Settled or Reversed. All the sales orders under this status show sales orders that are not invoiced but for whose GRN/ Delivery Has been Made these must be Invoiced. All the “Transfer Orders” under this status should be should be Un-reserved Before Closing All the “journals” Under This Status Must Be Settled or Reversed. 2. Post/delete unposted inventory journals 3. Close if there’s any registered/Picked journals 2. Closing the Inventory : during off working hours – this is a mandatory condition. To conclude, following a structured month-end close process ensures accurate financial reporting, prevents transaction mismatches, and keeps inventory valuation aligned with company objectives. By maintaining disciplined inventory management and performing routine cleanups, organizations can significantly enhance operational efficiency and ensure compliance with financial regulations. This SOP provides a clear roadmap for month-end inventory reconciliation, ensuring a smooth and error-free closing. We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com
Share Story :
Out-of-the-Box or Open-Source? Choosing Between Business Central and Odoo
As businesses grow, the need for a solid, scalable ERP system becomes clear. Two popular names frequently pop up in these exchanges Microsoft Dynamics 365 Business Central and Odoo. Both have their strengths, and both pledge to streamline operations but the real question is which one’s the better fit for your business? Let’s break it down — not in tech slang, but in real- world, business- leader language. The Core Philosophy Business Central is a Microsoft product built for businesses that want a solid, all-inclusive ERP solution with advanced financial capabilities and seamless Microsoft 365 integration. Odoo, on the flip side, is modular and open-source. It appeals to businesses that need a flexible system they can customize heavily to match specific processes. What Business Leaders Need to Know Business Central feels familiar to anyone who is worked with Excel, Outlook, or brigades. It’s designed to “just work” within the Microsoft ecosystem, which lowers the learning curve. Odoo’s interface is clean and ultramodern, but it can take a bit further trouble to set up and learn — especially if you’re customizing heavily. Business Central offers rich out- of- the- box functionality, especially when it comes to finance, supply chain, and force. utmost-sized businesses find that they do n’t need important customization to get started. With Odoo, you get the basics and also make from there. It shines when you need commodity veritably specific, but this also means further outspoken work. This is where Odoo really shines. You can tweak nearly every part of it. But with great inflexibility comes great responsibility — meaning further involvement from inventors. Business Central allows customization too, but within rails. It’s more structured, which means smaller surprises latterly on. If your company already relies on Microsoft products, Business Central integrates effortlessly—Teams, Power BI, Excel, and more. Odoo integrates too, but you might need additional connectors or custom development to get everything working smoothly. Business Central is erected for businesses that are spanning presto. It’s used by companies with hundreds of druggies and supports complex financials, global operations, and strict compliance requirements. Odoo is great for startups and small businesses, and it can grow but there’s a point where scaling can come more complex, especially if heavy customization is involved. What About Cost? Odoo has a character for being more affordable outspoken, especially the open- source interpretation. But keep in mind customization, hosting, and ongoing support can add up. Business Central might look more precious on paper, but it comes with stability, security, and erected- in integrations that reduce the need for bolt- on results. So Which One’s Right for You? Choose Business Central if you Choose Odoo if you To conclude, there’s no universal “best ERP”—only the best one for your business. Business Central and Odoo both offer strong value, but suit different types of organizations. Still unsure? Let’s have a conversation. For more information on Microsoft products, you can reach out to us at transform@cloudfonts.com.
Share Story :
Transforming Development: How Copilot is Revolutionizing Developer Productivity
Software development has been around since the 1940s.We started with punch cards, then machine language, followed by assembly, high-level programming languages, low code, no code, and now AI-assisted coding. Along the way, several tools have been developed to make programmers’ jobs easier, from card sorters and verifiers to debuggers and IDEs. Now, with the advent of AI, we have large language models (LLMs) writing code for us, but I don’t think it’s quite there yet. In this article we’ll see how AI assists developers, what it can do for us today, its limitations, and where it’s headed. The concept of AI began in the 1950s when researchers tried to imbue machines with the magic to think. Early systems followed set rules, but as computers improved and data became more available, smarter methods emerged, such as machine learning, natural language processing, and neural networks. Large Language Models (LLMs) grew from these advances, using huge amounts of data and computing power to understand and create language. This marked a shift from fixed rules to models that learn on their own. By 2025, AI has taken root in most fields, even in places we might not have expected.For example, robotic bees — tiny drones designed to mimic bee behavior, are now being used to assist with pollination in areas where natural bee populations are struggling. These drones combine machine learning and computer vision for navigation, flight control, pollination strategies, and swarm intelligence. Usage Copilot is integrated with both Visual Studio Code and Visual Studio, and it comes with a few LLMs built in by default.Currently, these include Claude Sonnet 3.5, GPT-4o, o3-mini, and Gemini Flash 2.0.If you want to add more models, you’ll need a subscription for Copilot Pro. We can use Copilot Chat to prompt these models directly in the sidebar chat, whether to generate a specific functionality or create an entirely new file. Here, I asked it to create a simple sales order.Notably, it kept the key details — Customer, Item, and Quantity — as parameters without requiring any input. From here, we can click a button to apply the changes to the open file. At the bottom, we can see which file Copilot is currently using as a reference.If we want to stop Copilot from referencing that file, we can click the eye button. We can also ask it to make changes to the generated code. Now, I noticed that while it has parameterized the “Customer No.” for the sales order, it hasn’t actually used it anywhere in the code. If I point this out to Copilot… Instead of using Copilot Chat, we can also get recommendations directly within the file.Here, I’m trying to write a function to delete a sales order based on the given SO No. I can just tab my way into writing the method. One common way I’ve used copilot is to add Guard clauses to methods that I’ve written. For instance – Here, it is referring to Customer and Item record variables, which don’t exist yet. But if I go to the variables section then it knows what I’m trying to do and suggests the same. Now, if I were to make it handle something complex, that’s when the cracks start to show. For example, pulling data from an API and creating customers would require several steps — authenticating with the API, fetching the data, parsing it, handling errors or logging, and finally creating the customers. We get the following as an output – Here, we can see that while it has a surface-level understanding of the code structure and the steps needed to achieve the goal, it struggles with the details. This could be because, unlike open-source languages like Java, Python, or C++, there isn’t as much publicly available source code for AL. I believe Microsoft Documentation would have helped to some degree, but instead, it tends to guess what the correct methods or fields should be. To its credit, the generated code isn’t far off from being functional, especially considering the simplicity of the input prompt. The structure it provides is still a solid starting point and much better than writing everything from scratch. Another example of these “hallucinations” is when it suggests methods that don’t actually exist, like this- However, once you show it what the correct method is, it suggests that – To go one step further, I asked the different models to create an entire project based on the below prompt – Findings: o3-mini 1. The objects it generated had the fewest errors.2. It was the simplest and closest to compiling successfully.3. It returned all the text in a single response, so I had to manually create files from it. GPT-4o 1. Created a Readme.md with project requirement details.2. Automatically generated the necessary project files.3. Farthest from compiling successfully, with most requirements missed.4. There were plenty of hallucinations, including methods that don’t exist in AL at all – like this example below. Gemini Flash 2.0 1. Created a Readme.md with project requirement details.2. Automatically generated the necessary project files.3. Added launch.json, settings.json, and app.json.4. Didn’t meet all requirements but managed to lay some groundwork.5. Struggled with code structure in several places, though still significantly better than GPT-4o.6. Had at least a couple of pages with zero errors. Claude Sonnet 3.5 1. Created a Readme.md with project requirement details.2. Automatically generated the necessary project files.3. Added launch.json and app.json.4. Included a test codeunit, though it had errors.5. Created a permission set for the objects generated.6. All files had one or more errors. In my opinion, Claude and o3-mini are the most useful for coding assistance. HumanEval is a test developed by OpenAI to assess how well language models can write code.It includes 164 programming problems where the model must generate accurate and functional Python code. The HumanEval leaderboard aligns with my assessment as well. Pricing While all these models offer a free trial with a limited set of tokens, they can become quite expensive if you don’t monitor your usage. Below … Continue reading Transforming Development: How Copilot is Revolutionizing Developer Productivity
Share Story :
How to Trim and Remove Spaces from Multiple Columns in Power Query
Efficient data cleaning is a crucial step in any data preparation process, and Power Query makes it easy to handle common tasks like trimming and removing unnecessary spaces with functions that you can apply across multiple columns and queries at once. By creating and invoking a function, you can quickly trim and remove spaces from all the columns & tables you need, saving time and effort. In this blog, we’ll show you how to use Power Query functions to streamline your data-cleaning process. The power query we are going to use to trim text in columns is – (text as text, optional char_to_trim as text) =>letchar = if char_to_trim = null then ” ” else char_to_trim,split = Text.Split(text, char),removeblanks = List.Select(split, each _ <> “”),result=Text.Combine(removeblanks, char)inresult This Power Query function takes text as input and removes extra spaces or a specified character from a text string. It splits the text into parts, filters out empty strings, and recombines the cleaned parts using the specified character. If no character is provided, it defaults to removing spaces. The power query we are going to use to remove spaces from the text is – (InputTxt as text) => let Clendata = Text.Combine(List.Select(Text.Split(Text.Trim(InputTxt),” “),each _ <> “”),“”) in Clendata The Power Query function removes all spaces from a given text string. It trims the input, splits it by spaces, filters out blanks, and then combines the parts into a single string. The result is a clean, space-free text, ideal for standardized data preparation. Now, we have our power query function ready, we can use this function across multiple columns or dataset. To do so, go to Add Column > Invoke Custom Function > Your Power Query Function. To conclude, Cleaning and transforming data in Power Query become much easier and more efficient with the use of custom functions. Whether you need to remove spaces, clean multiple columns, or standardize text, these functions save time and ensure consistency across your dataset. By applying these techniques, you can handle large, messy datasets with ease, making your data ready for analysis or reporting. Start implementing these simple yet powerful methods today to streamline your data preparation process! We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com.
Share Story :
Streamlining Document Uploads for Entities by Sales Team Members Using the Mobile Application
Uploading documents to Dynamics 365 through mobile devices can enhance the flexibility and efficiency of your team members. In this blog, I’ll Walk you through a step-by-step procedure for uploading documents using the **Sales Team Member** app on mobile devices. This guide focuses on document upload via the mobile version of Dynamics 365, showcasing how easy it is to manage files on the go. Whether you’re a Sales Team Member or an administrator, this simple process will help you streamline document management using the mobile application. The Use-Case: Uploading Documents in Sales Team Member Imagine a scenario where your team needs to upload documents related to orders, opportunities, or leads while out in the field. Using the Sales Team Member app, the document upload process is streamlined and works seamlessly. Here’s how you can do it: Key Components of the Solution PowerApps Mobile Application: This app provides an easy-to-use interface for users to interact with Dynamics 365 on their mobile devices, including document uploads. Document Upload in Dynamics 365: The process allows users to upload files to records in various entities such as Order Fulfillment, Leads, Opportunities, etc. SharePoint Integration: After uploading the document via mobile, it is stored in SharePoint, where it is accessible both on the mobile device and the web interface. Step-by-Step Process Step 1: Install the Power Apps Application Navigate to your App Store or Play Store, install the Power Apps app, and open it. Step 2: Sign In Sign in with your work account by adding it to the app. Enter your credentials when prompted. Step 3: Access the Sales Team Member App Once logged in, find and select the Sales Team Member app to access your required entities and records. Step 4: Navigate to the Order Fulfillment Entity To upload a document, go to the Order Fulfillment entity. The upload process is the same across all entities. Step 5: Upload the Document In the Order Fulfillment record, tap the Related tab, then select Documents. Tap the ellipsis (three dots) beside the Document Associated Grid and choose Upload. Select Choose File to upload the document from your mobile storage. Step 6: After selecting Upload, you’ll see a prompt. Tap Choose File to access your Gallery/File Storage. Select your desired file, then tap OK. Step 7: View Uploaded Document Once uploaded, the document will display on your mobile app, and you can also view it on the web version. The document will be stored in SharePoint and accessible from either platform. Mobile version: Web version: On opening the file, the file opens SharePoint and displays the document. To encapsulate, with the above procedure, Sales Team Members can easily upload documents via their mobile devices in Dynamics 365, making it easier to manage and share important files from anywhere. This streamlined process not only boosts efficiency but also ensures your team stays connected, even when working remotely or on the move. Hope this helps!!! We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com.
Share Story :
How to Display the ‘+New’ Quote Button Only for System Administrators Using JavaScript and Ribbon Workbench in Dynamics 365 CRM
Uploading and managing quotes efficiently is crucial for Dynamics 365 CRM users. However, sometimes you may want to restrict certain buttons, such as the ‘+New’ Quote button, to only users with specific roles, like the “System Administrator.” In this guide, I’ll walk you through how to achieve this by leveraging JavaScript and the Ribbon Workbench tool in Dynamics 365. This method allows administrators to control button visibility based on user roles, ensuring that only users with the correct permissions can access sensitive functionality. The Use-Case: Restricting Access to the ‘+New’ Quote Button for Non-Administrators. Imagine a scenario where your organization needs to ensure that only users with a “System Administrator” role can create new quotes in Dynamics 365. This is crucial for maintaining control over who can initiate important processes within your CRM system. Using JavaScript and Ribbon Workbench, you can easily customize the UI to hide the ‘+New’ Quote button for non-administrators. Here’s how this use case can be implemented: In this scenario, your team wants to ensure that only system administrators have access to the “+New” button for creating quotes in the system. For non-administrators, the button will be hidden from both the homepage subgrid and the main quote tab to prevent unauthorized users from creating quotes. By using the Ribbon Workbench tool, a custom JavaScript function is created to check if a user has the “System Administrator” role. If they do, the “+New” button remains visible, and they can create a new quote. For all other users, the button is hidden. Key Components of the Solution 1. Ribbon Workbench: The Ribbon Workbench tool allows you to customize the Dynamics 365 ribbon, enabling you to create custom buttons and define their visibility and actions. It is used to create the new custom “+New” Quote button, which replaces the default button while maintaining system integrity. 2. JavaScript Customization: Custom JavaScript is used to manage role-based access for the “+New” Quote button. The script checks the user’s role within Dynamics 365 to ensure that only users with the “System Administrator” role can view and use the button. This helps enforce security and restricts unauthorized users from creating new quotes. 3. Enable Rule for Button Visibility: An Enable Rule is set to control the visibility of the custom “+New” Quote button based on the user’s role. It ensures that only users with the “System Administrator” role can see and use the button, while hiding it for other users. 4. Custom Button Action (Command): The command linked to the custom “+New” button triggers a custom action (JavaScript function) to open the quote form. This ensures that the action associated with the button aligns with the business needs and provides a seamless user experience for administrators. Step-by-Step Process Sign in to Dynamics 365 using your URL, such as abc.dynamics.com, and enter your credentials or login to make.powerapps.com Create a solution and add the web resource. Once it’s done login to ribbon workbench from XRM toolbox and connect to your organization. After logging in, it is recommended to create a new solution for Ribbon Workbench in Dynamics 365. Ensure that no forms, views, charts, or other entities are included, as Ribbon Workbench may fail to upload the solution with excessive data. Only include the Quote entity with no additional dependencies. Ensure the existing +New Quote button is hidden, as modifying Microsoft-standard buttons is not recommended. Instead, create a new custom button and implement the functionality for creating a new quote Form using custom JavaScript. I have provided the code for this functionality as well. Ensure that the existing +New button for quote would be hidden from the homepage Subgrid and the quotes main tab. Next step would be to create a enable rule. Enable rule is used to control the visibility and availability of a button or command of the button. Name the id of your choice but make sure to add the suffix Enable Rule. Here, un-customised is set to False. By setting isCore (or Un customized) to false, you’re indicating that the button or element is a custom component, not part of the out-of-the-box (core) solution provided by Microsoft. This helps differentiate custom actions from the default ones in the system. Below is the code for the new quote form create and user role-based code. Make sure to select the Function name properly. After setting the enable rule, go to the Commands section in Ribbon Workbench and rename the command. A command defines the action triggered by a button click. Since this is a new button, you’ll need to add the custom form opening code. Below is the function for creating the form. Final Steps: Once the command is added, don’t forget to add the Enable rule that you have created above. Once the command is added, make sure to add all the rules we wrote into the custom button. The image also needs to be added so that the icon can be visible. My custom +New icon looks like this. Testing: Once everything is done, make sure Publish the changes. You can now try to log in from the user that has no System administrator role. Once logged in, you can see that button is not visible. Button will be only visible to user that have system Administrator role. User having no System Administrator role. You can see below that there’s no +New button displayed. To conclude, by following this guide, you can efficiently control the visibility of the ‘+New’ Quote button in Dynamics 365 CRM, making it accessible only to users with the “System Administrator” role. This ensures better control over who can create quotes in the system while maintaining the flexibility of user roles. We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com.
Share Story :
Avoiding Negative Inventory: Tips and Tricks in D365 F&O
Managing inventory is an important part of any business, and keeping track of stock levels is key to smooth operations. Negative inventory happens when your system shows that you have less than zero items in stock. This can cause problems like delays, mistakes in finances, and unhappy customers. Luckily, Dynamics 365 Finance & Operations (D365F&O) has tools to help you avoid negative inventory. In this blog, we’ll share simple tips and tricks to keep your inventory accurate. What is Negative Inventory? Negative inventory means your system says you have less stock than zero. For example, if you sell or use more items than you have in storage, the system might show a negative number. This can happen because: Negative inventory can cause confusion, financial mistakes, and problems in planning and ordering stock. How to Avoid Negative Inventory in D365F&O Here are some easy steps to prevent negative inventory in D365F&O: 1. Set Up Item Model Groups Item model groups control how inventory is managed. Setting them up properly helps avoid negative inventory. 2. Use Inventory Reservations Inventory reservations make sure stock is set aside for specific orders, so you don’t overcommit. 3. Track Inventory Dimensions Inventory dimensions, like site, warehouse, batch, and serial number, help you track stock accurately. Make sure these are used correctly for each product. 4. Do Regular Cycle Counts Cycle counts help you check if the stock in your system matches what you actually have. Fixing any mistakes quickly avoids negative inventory. 5. Post Transactions in Order Posting transactions in the wrong order can cause temporary negative inventory. For example, issuing stock before recording receipts. 6. Check Inventory Transactions Often Review inventory transactions to catch and fix issues early. 7. Train Your Team Training your team is key to preventing mistakes that lead to negative inventory. Benefits of Avoiding Negative Inventory Preventing negative inventory can make a big difference for your business: Avoiding negative inventory in D365F&O is about using the right settings and following good processes. By setting up item model groups, using reservations, doing regular cycle counts, and keeping an eye on transactions, you can prevent negative inventory and keep your stock levels accurate. These steps will improve your operations, make customers happy, and help your business run smoothly. Start using these tips today to get the most out of Dynamics 365 Finance & Operations for inventory management! So, that its for this blog. Thanks for reading!! We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com.