Tag Archives: D365 Finance and Operations
Change planned purchase order status as draft insted of default approved
When we create purchase order using planned order its default approval status will be approved as displayed in screenshot. To change that status to draft write following code where we will change its status to draft and further code to is to remove version of purchase order which necessary to make delete button enabled on purchase order form code:- /// <summary> /// extension of class: ReqTransPoMarkFirm /// </summary> [ExtensionOf(classStr(ReqTransPoMarkFirm))] final class ReqTransPoMarkFirmCFSClass_Extension { public container conPurchOrders; /// <summary> /// updatePurchTable /// </summary> /// <param name = “_purchTable”>_purchTable</param> protected void updatePurchTable(PurchTable _purchTable) { conPurchOrders += _purchTable.PurchId; next updatePurchTable(_purchTable); } /// <summary> /// purchTablePostProcessing /// </summary> protected void purchTablePostProcessing() { next purchTablePostProcessing(); for (int i = 1; i <= conLen(conPurchOrders); i++) { PurchTable purchTable = PurchTable::find(conPeek(conPurchOrders, i), true); if(purchTable.RecId) { ttsbegin; //delete the version created for po PurchTableVersion purchTableVersion = PurchTableVersion::findLatest(purchTable.PurchId, purchTable.DataAreaId, true); if(purchTableVersion.RecId) { purchTableVersion.delete(); } purchTable.ChangeRequestRequired = NoYes::No; purchTable.DocumentState = VersioningDocumentState::Draft; purchTable.update(); ttscommit; } } } } I hope this will helo you,thank you
Dynamics 365 Connected Store
In retail, success relies on a consistent customer experience across web, mobile and physical storefronts. The challenge for omni-channel retailers is ensuring the same level of service and convenience in physical locations as online—from stocking the same variety of inventory to offering personalized recommendations based on browsing and buying behaviour. Dynamics 365 Connected Store is a new application that provides insight into the retail space, helping physical retailers understand and improve the in-store experience by analysing disparate data from video cameras and IoT sensors to providing real-time and predictive insights that help store managers and employees make better decisions. Dynamics 365 Connected Store uses observational data generated as customers move through the store, as well as the status of store equipment and product, to create employee alerts and actionable insights that can improve store efficiency. For instance, Connected Store can improve the checkout experience by triaging extra cashiers via instant notifications, based on sensor or camera data. Fluctuations in the condition of store equipment such as freezers and refrigerators can put product quality at risk. Connected Store, supported by Azure IoT Central, utilizes IoT sensors to monitor temperature and humidity, which can quickly highlight any anomalies to protect inventory. Connected Store also tracks long-term trends in the retail space, illuminating patterns and opportunities across day-to-day, season-to-season activities and occurrences. Teams across the organization can stay updated with automated emails and a web app to review and report data. Whether you’re a regional manager who seeks to increase revenue and reduce cost by optimizing operations, a store manager who seeks to better-utilize their teams, or a store associate who seeks to better-prioritize their daily activities, Connected Store offers you benefits that can help you optimize customer experience. Hope this blog is Helpful.
Hide non-carrier delivery modes from the shipping options in POS
This topic describes a configuration option that is available for the point of sale (POS) application. This configuration option changes the behaviour for the selection of a mode of delivery when shipment orders are created in POS. When users create customer shipment orders in POS, they can select a mode of delivery for the shipment. This functionality is available regardless of whether the whole order is being shipped or only selected lines. By default, the dialog box where a mode of delivery is selected shows all the valid modes of delivery for the combination of a channel, an item, and a delivery address. These modes of delivery are defined on the Modes of delivery page in Headquarters (Sales and marketing > Setup > Distribution > Modes of delivery). “Non-carrier” modes of delivery, such as Carryout or Pickup, might also appear for selection in the dialog box. However, a feature has been added that lets you hide non-carrier modes of delivery in the dialog box. To turn on this feature, on the Commerce parameters > Customer orders tab, set the Show only carrier mode options for ship orders option to Yes. After you turn on this feature and run the appropriate distribution jobs to sync the information to the channel database, non-carrier modes of delivery won’t appear for selection during the process of creating shipment orders in POS. Hope This helps. Thankyou!
Your connection is not private | NET::ERR_CERT_DATE_INVALID Error in D365 Finance and Operations
As seen in title when error “Your connection is not private | NET::ERR_CERT_DATE_INVALID” occured which seems as follows in screenshot when you try to open environment link in browser. The reason for above error in my case was that SSL certificate was expired as you can see in following screenshot To solve this issue go to your lcs.dynamics.com with your credentials and open your project now select which ever environment and visit see details/Full details page and click on maintain button and select Rotate secrets button Now click on Rotate SSL certificates after which dialogue box will appear click on yes Now wait till rotating secret symbol is loading as following screenshot after which you will be able to access your D365 Finance and operation link easily. Hope this blog will help you.Thank you
Rest API GET call in JSON format in Dynamics 365 Finance and Operations
Introduction: In this blog, we will see how to get response from Rest Api through GET call Solution: Consisting of basic authentication, we will pass username and password in byteStr and for the endpoint we will put it in url in below code. class CFSJSTestRestAPI { public static void main(Args _args) { int find; str url,aosUri,activeDirectoryTenant; str activeDirectoryClientAppId; str activeDirectoryClientAppSecret; str postData,activeDirectoryResource; str aadClientAppSecret,oAuthHeader; str returnValue,jsonString,jsondszstr; System.Net.HttpWebRequest request; System.Net.HttpWebResponse response; System.Byte[] byteArray; System.IO.Stream dataStream; System.IO.StreamReader streamRead; System.IO.StreamWriter streamWrite; System.Net.ServicePoint servicePoint; System.Net.ServicePointManager servicePointmgr; System.Net.HttpVersion version; CLRObject clrObj; Newtonsoft.Json.JsonReader reader; System.Text.Encoding utf8; Counter countCounter; Object obj; Map data; System.Byte[] byteArraynew; System.Net.WebHeaderCollection headers = new System.Net.WebHeaderCollection(); new InteropPermission(InteropKind::ClrInterop).assert(); str byteStr = strfmt(‘%1:%2’, “USERNAME”, “PASSWORD”); headers = new System.Net.WebHeaderCollection(); url = “http://dummy.restapiexample.com/api/v1/employees”; clrObj = System.Net.WebRequest::Create(url); request = clrObj; request.set_Method(“GET”); request.set_KeepAlive(true); request.set_ContentType(“application/json”); utf8 = System.Text.Encoding::get_UTF8(); byteArraynew = utf8.GetBytes(byteStr); byteStr = System.Convert::ToBase64String(byteArraynew); headers.Add(“Authorization”, ‘Basic ‘ + byteStr); request.set_Headers(headers); servicePoint = request.get_ServicePoint(); System.Net.ServicePointManager::set_Expect100Continue(false); System.Net.ServicePointManager::set_SecurityProtocol(System.Net.SecurityProtocolType::Tls12); response = request.GetResponse(); dataStream = response.GetResponseStream(); streamRead = new System.IO.StreamReader(dataStream); jsonString = streamRead.ReadToEnd(); info(strFmt(“RESPONSE: %1”,jsonString)); dataStream.Close(); response.Close(); } } Thanks for reading !!!
Set form control access via security role in D365 Finance
In some of the cases instead of providing security to whole form we need it for particular form control.So this blog will help you with providing access to form control via security roles.If you want to know more about security roles you can use my previous blog . First of all we need form control where we need to set some of the properties as follows. In our case we are using laid off button as shownNow select the button and press F4 for its properties and set needed permision to manual as follows Now in your desired security privilege you can either directly set form control permissions or Entry Points.For form control permission method right click on form control permission and select new form and after that set name property to your desired form (Hcmworker in our case) as follows Now right click on your form and select New control option as follows and set control name and permission for it as follows For Entry point method you need first need to add new entry point and set its object type and object name properties or for existing ones select desired entry point and click on drop down arrow and on controls right click and select new control.And now set its grant and name properties to desired control and its access rights After this you need to assign this privilege in desired security role and security duty as previously discussed in security role blog
Create security role in D365 Finance and operation
In D365 Finance and Operations when you need to provide and restrict users from a certain operation you can make use of security roles. You can create security roles from Finance and operations environment itself or from its development tool i.e Visual Studio. In this blog, we are going to create a security role in Visual Studio as follows. Create privilege First of all we need to create privilege as follows now we need to add new entry point and set object type in our case display menu item from properties Now add object name(display menu item name) as follows create role Now we need to create role where above created privilege will be needed create new security role as follows now we need to add new privilege in role as shown And from properties select privilege which we have created in previous step Create Duty Now we have to create new duty and assign previously created privilege in its properties as shown Now we can see security role in FnO environment select any user from system administration>>users and click on assign role as follows and now search for priviously created role and click on Ok button now your security role is assigned to user with our role will be able to see the object like form, report etc except user with system administrator.
Customize Purchase order approval status
In the case of D365 Finance and Operations when you approve purchase requisition by default system creates Purchase order with approval status as “Approved” as follows To change this default behavior of system such that once purchase requisition is approved the approval status of the purchase order as a draft you can use the following class class CFSPOStatus { /// <summary> /// /// </summary> /// <param name=”args”></param> [PostHandlerFor(classStr(PurchAutoCreate_PurchReq), methodStr(PurchAutoCreate_PurchReq, endUpdate))] public static void PurchAutoCreate_PurchReq_Post_endUpdate(XppPrePostArgs args) { //PurchTable purchTable = args.getThis(‘purchTable’); PurchAutoCreate_PurchReq purchReq = args.getThis() as PurchAutoCreate_PurchReq; PurchTable purchTable, purchTablenew; purchTable = purchReq.parmPurchTable(); ttsbegin; select forupdate purchTablenew where purchTableNew.PurchId == purchTable.PurchId; if(purchTablenew && purchTablenew.DocumentState == VersioningDocumentState::Approved) { purchTablenew.DocumentState = VersioningDocumentState::Draft; purchTablenew.update(); } ttscommit; } }and your final result looks like And after changing status you can apply your own purchase order workflow on it. For purchase order workflow you can refer to my blog
Develop Custom Workflow:Counting Journals workflow
In this blog, you will learn how to develop a custom workflow that is not present out of the box in D365 Finance. For this blog I’m creating a workflow for Counting Journal (Inventory management>>Journal Entries>>Item Counting>>Counting) because there is no such workflow for inventory management module. The followings are steps that are to be followed. Steps:- 1. Create a base Enum for Document Status 2. Create a table extension and add Enum to table 3. Add document status field to form extension 4. Create query 5. Create workflow category 6. Create a workflow type 7. Now add can submit workflow and updateworkflow methods to tables class extension 8. Update submitmanager class 9. Update EventHandler class 10. Workflow approval creation 11. Add an element to workflow Type 12. Now add workflow setup form to the inventory management module Now we are performing steps in detail 1. Create a base enum for Document Status Make sure you have created a solution, project and assign the model to the project. Now add new item and select Base Enum. And Add Base Enum and name it as CFS_InventoryCountingWorkflow 2. Create a table extension and add enum to table We are creating a workflow for inventory management so we need to create an extension of InventoryJournalTable and drag above created base enum to table which will create a new field of type Enum. 3. Add Document status field to form extension Now we need to create an extension of form InventJournalCount and add newly created table field to forms grid by dragging it from data source to form grid control and assign label as approval status. 4. Create query Now again add a new query to project and name it as CFS_InventoryCountingWorkflow and add the InventJournalTable and set properties as follows 5. Create workflow category Now we are going to add Workflow category to project and name it as CFS_InventJournalCounting and set the properties as follows 6. Create a workflow type After adding workflow category its time to add workflow type name it as CFS_InventoryJournalCounting and set its properties as follows this will create new elements such as classes and action menu items for submit and all actions. 7. Now add can submit workflow and updateworkflow methods to tables To add a method to the table we need to create a table class extension for that add a new class and name it as InventJournalTable_CFSExtension and need to add updateWorkflow and canSubmitWorkflow methods. You can use the following code [Extensionof(tableStr(InventJournalTable))] final class InventJournalTable_Extension { public boolean canSubmitToWorkflow(str _workflowType) { boolean ret = next cansubmitToWorkflow(_workflowType); ret = this.CFS_InventoryCountingWorkflow == CFS_InventoryCountingWorkflow::Draft; return ret; } public static void updateWorkflowStatus(RecId _documentRecId, CFS_InventoryCountingWorkflow _status) { ttsbegin; InventJournalTable document; update_recordset document setting CFS_InventoryCountingWorkflow = _status where document.RecId == _documentRecId; ttscommit; } } 8. Update submitmanager class Make sure you have the same name for submitting manager class or rename it as follows and following code to that public class CFS_InventoryJournalCountingSubmitManager { private InventJournalTable document; private WorkflowVersionTable versionTable; private WorkflowComment comment; private WorkflowWorkItemTable workItem; private SysUserId userId; private boolean isSubmission; private WorkflowTypeName workflowType; public static void main(Args args) { // TODO: Write code to execute once a work item is submitted. if (args.record().TableId != tableNum(InventJournalTable)) { throw error(‘Error attempting to submit document’); } InventJournalTable document = args.record(); FormRun caller = args.caller() as FormRun; boolean isSubmission = args.parmEnum(); MenuItemName menuItem = args.menuItemName(); CFS_InventoryJournalCountingSubmitManager manager = CFS_InventoryJournalCountingSubmitManager::construct(); manager.init(document, isSubmission, caller.getActiveWorkflowConfiguration(), caller.getActiveWorkflowWorkItem()); if (manager.openSubmitDialog(menuItem)) { manager.performSubmit(menuItem); } caller.updateWorkflowControls(); } /// <summary> /// Construct method /// </summary> /// <returns>new instance of submission manager</returns> public static CFS_InventoryJournalCountingSubmitManager construct() { return new CFS_InventoryJournalCountingSubmitManager(); } /// <summary> /// parameter method for document /// </summary> /// <param name = “_document”>new document value</param> /// <returns>current document</returns> public Inventjournaltable parmDocument(Inventjournaltable _document = document) { document = _document; return document; } /// <summary> /// parameter method for version /// </summary> /// <param name = “_versionTable”>new version table value</param> /// <returns>current version table</returns> public WorkflowVersionTable parmVersionTable(WorkflowVersionTable _versionTable = versionTable) { versionTable = _versionTable; return versionTable; } /// <summary> /// parameter method for comment /// </summary> /// <param name = “_comment”>new comment value</param> /// <returns>current comment value</returns> public WorkflowComment parmComment(WorkflowComment _comment = comment) { comment = _comment; return comment; } /// <summary> /// parameter method for work item /// </summary> /// <param name = “_workItem”>new work item value</param> /// <returns>current work item value</returns> public WorkflowWorkItemTable parmWorkItem(WorkflowWorkItemTable _workItem = workItem) { workItem = _workItem; return workItem; } /// <summary> /// parameter method for user /// </summary> /// <param name = “_userId”>new user value</param> /// <returns>current user value</returns> public SysUserId parmUserId(SysUserId _userId = userId) { userId = _userId; return userId; } /// <summary> /// parameter method for isSubmission flag /// </summary> /// <param name = “_isSubmission”>flag value</param> /// <returns>current flag value</returns> public boolean parmIsSubmission(boolean _isSubmission = isSubmission) { isSubmission = _isSubmission; return isSubmission; } /// <summary> /// parameter method for workflow type /// </summary> /// <param name = “_workflowType”>new workflow type value</param> /// <returns>current workflow type</returns> public WorkflowTypeName parmWorkflowType(WorkflowTypeName _workflowType = workflowType) { workflowType = _workflowType; return workflowType; } /// <summary> /// Opens the submit dialog and returns result /// </summary> /// <returns>true if dialog closed okay</returns> protected boolean openSubmitDialog(MenuItemName _menuItemName) { if (isSubmission) { return … Continue reading Develop Custom Workflow:Counting Journals workflow
Overview of Modern POS with Retail Store Scale Unit (RSSU)
Retail Store Scale Unit allows retailers to sell products within store locations that have internet connectivity issues, where it fails to connect with headquarters (HQ). Retail Store Scale Unit support both Modern POS and Cloud POS within the store. MPOS with Retail Store Scale Unit allows users to perform cross-terminal scenarios across multiple POS devices, like Suspend Shift Close Shift Blind Close Shift Manage Shift Inventory Lookup Stock Count Print X-Report Print Z-Report whereas Cloud-based MPOS offline fails to perform these operations. MPOS with Retail Store Scale Unit fails to perform real-time operations such as Issue/pay Gift Cards Issue Loyalty Card Picking and Receiving Pay by Customer Account Credit Card transactions Order Fulfillment View/Create Time clock entries unless there is internet connectivity to HQ or a payment provider. If most of your transactions involve real-time transactions, then your Store Scale Unit will always need internet connectivity to enable the connection to HQ or payment provider.
