Sunday, 25 November 2018

Job to get the print management report format name through X++ code in D365

Recently I have a got a requirement in which I want to get the SSRS report format name selected in print management settings, for that I have created a job to get the report format name in print management settings.

For this example, I am using Customer Invoice report (e.g., SalesInvoice.Report).












Note: We can use print management settings for SSRS report through "Use Print Management" menu.

Source code explanation:
  • Document type here, Sales order invoice. (Enum)
  • Table joins:
    • PrintMgmtDocInstance table holds information about the overwritten destinations.
    • PrintMgmtReportFormat table contains SSRS report names that users can choose from as alternatives for reports that are controlled by print management.
    • PrintMgmtSettings table contains specific print management settings that are applied when a document is printed.
  • Get the report name from PrintMgmtReportFormat table, Name field contains the report format name.














Result:


Saturday, 24 November 2018

Job to apply vendor prepayment on (PO) invoice through X++ code in D365

Prepayments are a common business practice, with organizations issuing prepayments to vendors for goods or services before those goods or services are fulfilled. To minimize risk, you can track prepayments by defining the prepayment on a purchase order. Vendors can also create a prepayment invoice that is associated with a purchase order.

In this blog, I will discuss how we can apply prepayment through X++ code.in Microsoft Dynamics 365 finance & operation.

Note: For applying the prepayment you need to have the vendor invoice, you can create manually or you can create it by X++ code Job to create vendor invoice (PO) through X++ code in D365.









For this example I have created a job, please see source code screenshots below.

Source code explanation (1.1): 
  • Initialize classes and tables buffers.
  • Get Vendor invoice by passing purchase order and invoice number.
  • Construct the VendAdvanceInvoice class.





















Source code explanation (1.2): 
  • Pass data to parm methods of VendAdvanceInvoice class.
  • Get purchase order amount calculation through PurchTotals class.
  • Iterate data of VendInvoiceInfoSubTable table.
  • Populate data in temporary tmpVendStandardInvoice table.












Source code explanation (1.3): 
  • Iterate record and populate data in tmpVendAdvanceInvoice table.













Source code explanation (1.4): 
  • Pass amount to applied as prepayment.
  • Pass temporary tables in OOTB of the vendAdvanceInvoice class.
  • Update invoice match status.











That is all you need to do, now build and run the job. 

Result:




Monday, 12 November 2018

How to email invoices in the right way in Dynamics 365 for Finance and Operations

In my previous blog, I have mentioned that I got a requirement to email invoices with the nicely designed email body and subject containing customer related information such as Invoice ID and Customer account number. Besides, I needed to attach some additional documents to outgoing emails and sent them together with invoices. This is, I would say, such a common scenario for emailing invoices but unfortunately still not provided in D365FO OOTB.

So for achieving this requirement I have found a completely free tool called Docentric that provides far more options regarding all print destinations for all SSRS reports, not just Email print destination and Customer invoice. Read more about its features in my previous blog >>

In this article I will discuss how we can use Docentric free-edition tool to achieve the above described scenario:
  1. Send emails to customers with the professionally looking email body.
  2. Provide sender display name through Docentric AX parameters setup.
  3. Provide dynamic email subject, company logo and email body content using placeholders for Invoice ID, Customer name, Customer reference, etc.
  4. Create a new custom placeholder for Customer requisition.
  5. Add additional email attachment InvoiceSpecification_<InvoiceId>.pdf.
For this blog example, I have set up Docentric Email as the target print destination for the Customer invoice report in Print management setup for Accounts receivable: Accounts receivable -> Setup -> Forms -> Form setup -> General (Side menu) -> Print Management (link) -> Customer invoice -> Original <default>.



















You can easily test these settings when posting an invoice from a sales order or from Invoice journal as show on the image below.









Email an invoice:
Accounts receivable -> Inquiries and reports -> Invoices -> Invoice journal -> Invoice (Menu) -> Document (Submenu) -> View (Submenu option) -> Use print management.

Note: For emailing, you need to setup Email parameters: System administration -> Setup -> Email -> Email parameters.
There are two email providers: 1) SMTP 2) Exchange.













Please make sure your email settings are working otherwise you will not be able to send emails. From the 8.1 app version you can send a test email directly from this form. Now let’s back to the blog topic.

Requirement 1:

Send an email with the nicely designed body. Docentric free-edition tool provides both designer editor and html source code editor so you can design your emails easily. For this example I have got an email template as html file. You can find email templates over the Internet or create your own custom design.























View in design editor of Docentric free-edition tool.














View in source code editor of Docentric free-edition tool. Here you can see the HTML & CSS code.













Requirement 2:


Provide sender display name through Docentric AX parameters setup.

Sender display name can be provided in the Docentric AX parameters form: Workspace -> Docentric AX (menu) -> Related links -> Docentric AX parameters.















Under the
Emailing option, you can find the Email sender display name field and enter any text as you like (in my case “Docentric services”).


Requirement 3:

Provide dynamic email subject, company logo and email body content using placeholders.

3.1 Email subject can be provided at the highlighted section in below screenshot. By giving a placeholder, at runtime Docentric will resolve this placeholder with its value.


Note: You can make attachment name also dynamic, for example: Invoice_@InvoiceId@.pdf. In fact, you can use placeholders in any of print destination settings where this makes sense.

3.2 Company logo is the OOTB placeholder. You can find it in the Fields drop-down list. When you place company logo in the email body, it automatically resolves into image as shown below.



3.3 Placeholders for email body content. You can simple click a placeholder from the Fields drop-down list and the editor will create the placeholder in your email body.



Requirement 4:

Create a new custom placeholder for Customer requisition of corresponding sales order.

Docentric free-edition tool provides OOTB placeholders for Invoice and other reports. But you can also create your own custom placeholders by doing very minimal coding in one of Docentric model’s classes.

OOTB placeholders already appears in the Fields drop-down list as you can see in above screenshots. For our new custom placeholder Customer requisition we need to customize so called Docentric DSP (Data Source Provider) class for Customer invoice in the Docentric AX SSRS Replicas model: DocSalesInvoiceReportDSP. This model is not part of the product but it’s an optional model that serves as starting point for customization like this.

Note: For better understanding of Docentric DSP classes, you can read this documentation.

In next steps, I am going to add a new Customer requisition placeholder, which should contain value from the Customer requisition field of the corresponding sales order.


Source Code Explanation:
  • Declare the Customer requisition placeholder variable that will hold its value.
















  • Fill the placeholder value in the onSelectedRdpTableRecord() method:
      
       SalesTable salesTable = SalesTable::find(header.SalesId);
       placeholder_customerRequisition = SalesTable.PurchOrderFormNum;


Source Code Screenshot:

















  • Declare a macro.
#define.CustomerRequisition('CustomerRequisition')
  • In the overrideReportRunSettings() method add DocPlaceholderAttribute for Customer requisition.
DocPlaceholderAttribute(#CustomerRequisition, 'INV - Customer Requisition')
  •        Add the X++ code in overrideReportRunSetting() method, which replaces each occurrences of the @CustomerRequisition@ placeholder with its value.
// -- Placeholder @CustomerRequisition@
placeholderMng.replacePlaceholderInCurrentPrintDest(#CustomerRequisition, placeholder_customerRequisition);


Source Code Screenshot:
















Then build and sync your code. Please see the result in Docentric free-edition email editor on the screenshot below – our new custom placeholder is now shown in the Fields dropdown list.

Result:


















Requirement 5:

Add additional email attachment.

In Docentric free-edition tool you will be able to add additional email attachments using the same DSP class that handles placeholders. It’s up to you where to store documents that need to be picked and emailed as additional attachments of your outgoing emails. Common place is Attachments of the context execution table record, in our case Sales order.

Note: To add a document to Attachments to your relevant sales order record(s) follow bellow steps.

Step 1:









Step 2:


















For adding an attached document as additional email attachment using Docentric free-edition tool we need to write some code in the same overrideReportRunSetting() method as we did for the custom placeholder Customer requisition.

Source Code Explanation:
  • The addAdditionalAttachment() method adds an additional email attachment to the email that will be sent together with the report itself in case of Email print destination.
  • Method signature has two arguments.
    • Additional attachment name (e.g. 'InvoiceSpecifcation_InvoiceId.pdf').
    • Attachment file content.
  • For attachment name I am concatenating InvoiceSpecification with InvoiceId.
  • For attachment file content I am getting invoice specification document for the related sales order from the DocuRef table .This table contains the references between documents and their associated tables and records.
//Add additional document.           
_reportRunContext.emailPrintDestSettings().addAdditionalAttachment(
strFmt('InvoiceSpecification_%1.pdf', placeholder_invoiceId),                DocumentManagement::getAttachmentAsContainer(DocuRef::findTableIdRecId(curExt(), tableNum(SalesTable), SalesTable::find(placeholder_salesId).RecId)));

Source Code Screenshot:







Now build and sync the code and let see the final result of the email body, placeholders, sender display name and additional attachment.


Final Result:


Job to create vendor invoice (PO) through X++ code in D365

A vendor invoice for a purchase order is an invoice that is attached to a purchase order. It contains a header and one or more lines for items or services. A vendor invoice finishes the purchase order, product receipt, and vendor invoice cycle.

In this blog I will discuss how to create purchase order invoice through X++ code in Microsoft Dynamics 365 finance & operation.

For this example I have created a job, please see source code screenshots below.

Source code explanation (1.1):
  • Initialize classes and tables buffers.
  • Get purchase order through find method.
  • Check Product receipt for the relevant purchase order exists.




















Source code explanation (1.2):

  • Populate data for insertions in Vendor invoice info table.
  • Call insert method of table.


















Source code explanation (1.3):

  • Insert data in VendInvoiceInfoSubTable .
  • Get product receipt lines for iteration, and populate invoice lines accordingly.



















Source code explanation (1.4):
  • Insert data in vendor invoice info lines.
  • Call insert method of table.














Source code explanation (1.5):
  • Insert data in VendInvoiceInfoSubLine table.
  • Call insert method of the table.
  • Info message for success.


















That is all you need to do, now build and run the job. 

Result



How to Get Customer Free Text Invoice "Totals" form field value with X++ in D365FO

Customer free text invoices are an essential aspect of financial management in D365FO. In this blog, I have compiled all the code needed to ...