Sunday, 13 May 2018

Calculate purchase/sales confirmation GST tax at line level (IGST/CGST/SGST) in AX 2012 R3

Hi guys,
It's very tricky to calculate GST percent at line level on purchase/sales confirmation because there is no direct table to fetch the GST percentage and value.

Here I am going to show you how we can calculate GST % at the line level.


In Data provider class creates a new method and this method calculate GST % and value


//#method1
private void getMeasures(ITaxDocument taxDocumentObject,RefRecId _PurchLinerecId)
{
    ITaxDocumentLineEnumerator          lineEnumerator;
    ITaxDocumentLine                    lineObject;
    ITaxableDocumentLine                taxableDocumentLine;
    ITaxDocumentComponentLineEnumerator componentLineEnumerator;
    ITaxDocumentComponentLine           componentLineObject;
    ITaxDocumentMeasureEnumerator       measureEnumerator;
    ITaxDocumentMeasure                 measureObject;

    LedgerVoucher                   ledgerVoucher;
    ITaxDocumentLine                taxDocumentHeaderLineObject;
    PurchLine_IN                    PurchLine_IN1;

    #TaxEngineModelLineMeasures


    if (taxDocumentObject)
    {
        lineEnumerator = taxDocumentObject.lines();
        while (lineEnumerator.moveNext())
        {
            lineObject = lineEnumerator.current();
            if (taxDocumentHeaderLineObject == null && lineObject.metaData().isHeaderLine())
            {
                taxDocumentHeaderLineObject = lineObject;
            }
            taxableDocumentLine = TaxableDocumentLineObject::construct(lineObject.sourceTableId(), lineObject.sourceRecId());
            componentLineEnumerator= lineObject.componentLines();

            if(lineObject.originSourceTableId() == 340 && lineObject.originSourceRecId() == _PurchLinerecId)
            {
                    //info(strFmt("%1-%2",lineObject.originSourceRecId(),lineObject.originSourceTableId()));
                    totval=0;
                    while (componentLineEnumerator.moveNext())
                    {
                        componentLineObject = componentLineEnumerator.current();
                        measureEnumerator = componentLineObject.measures();
                        while (measureEnumerator.moveNext())
                        {
                            measureObject = measureEnumerator.current();
                            if(measureObject.metaData().name() == strFmt("Rate") && componentLineObject.metaData().taxType() == "GST"
                              &&
                              (componentLineObject.metaData().taxComponent() == "CGST" ||
                              componentLineObject.metaData().taxComponent() == "IGST" ||
                              componentLineObject.metaData().taxComponent() == "SGST")
                              )
                            {
                                totval += measureObject.value().value();
                                //info(strFmt("%1--%2--%3",componentLineObject.metaData().taxComponent(),measureObject.metaData().name(),measureObject.value().value()));

                            }
                        }
                       // getTotal = totval*100;
                       // info(strFmt("%1",getTotal));
                    }
                    getTotal = totval*100;
                    //info(strFmt("%1",getTotal));
            }
        }
    }
}
___________________________

//#method2
Create another method in DP class with recid as a parameter and we will call earlier created getMeasures method in this class

private void getMeasuresforPurchLine(RefRecId _PurchLinerecId)
{
    ClassName                   bundlerClassName;
    TaxableDocumentDescriptor   bundler;
    ClassId                     bundlerId;
    ITaxableDocument            taxableDocumentObject;
    ITaxableDocumentLine        taxableDocumentLineObject;
    Common                      transactionTable =  PurchTable::find(PurchLine::findRecId(_PurchLinerecId).PurchId) ;  //SalesTable::find('F898-000626');
    SalesPurchJournalLine_IN    transactionLineTable;
    TaxValue                    gstTaxValue;
    ITaxDocument                taxDocumentObject;
    ITaxableDocument            taxableDocumentObjectLoc;
    TaxableDocumentDescriptor   descriptor;
    TaxDocumentProxy            taxDocProxy;
    ITaxDocumentLineEnumerator  taxDocLineEnumerator;
    ITaxDocumentLine            taxDocLine;
    SalesLineAmount             salesLineAmount,salesLineBaseAmt;
    ITaxDocumentComponentLineEnumerator cLineEnum;
    ITaxDocumentComponentLine           cLine;
    //str                         taxComponent;

    bundlerClassName = 'TaxableDocDescriptorPurchaseOrder';
    bundlerId = className2Id(bundlerClassName);

    if (SysDictTable::isTableMapped(tableNum(SalesPurchJournalLine_IN), transactionTable.TableId)
        && transactionTable.TableId != tableNum(LedgerJournalTrans))
    {
        transactionLineTable = transactionTable;
        transactionTable = transactionLineTable.SalesPurchJournalLine_IN::salesPurchJournalTable();
    }

    if (bundlerId != 0)
    {
        bundler = TaxableDocumentDescriptor::getTaxDocumentdescriptorServer(bundlerId, transactionTable);

        if (!bundler.skipTaxDocument())
        {
            taxableDocumentObject = TaxableDocumentObject::constructServer(bundler);
            taxDocumentObject = TaxBusinessService::recalculateTax(taxableDocumentObject, false);
        }

        if (taxDocumentObject)
        {
            // calling the above method
            this.getMeasures(taxDocumentObject,_PurchLinerecId);
        }
    }
}
____________________________

//#method3
Here we will create a new method getGSTpercent and call getMeasuresforPurchLine to get the punchline records.

private void getGSTPercent(PurchLineAllVersions     _purchLineAllVersions)
{
    PurchTable          PurchTableLoc;
    PurchLine           PurchLineLoc;
    VendPurchOrderJour  vendPurchOrderJourLoc;
    PurchLineAllVersions    purchLineAllVersions;

    select vendPurchOrderJour
        where vendPurchOrderJour.PurchId == purchid;

        select PurchLine
            where PurchLine.InventTransId == _purchLineAllVersions.InventTransId;

        this.getMeasuresforPurchLine(purchline.RecId);
}

With this above logic, we can calculate GST percent and value at line level.


Happy DAxing:-)

Monday, 19 February 2018

Get financial dimension by Recid.

Get financial dimension by Recid.

public static container getFinancialDimensionsByRecId(RecId     _defaultDimension)
{
    DimensionAttributeValueSetStorage    dimStorage;
    Counter                              i;
    container                            ctr;
    ;

    dimStorage = DimensionAttributeValueSetStorage::find(_defaultDimension);

    for (i=1 ; i<= dimStorage.elements() ; i++)
    {
        ctr   += [DimensionAttribute::find(dimStorage.getAttributeByIndex(i)).Name, dimStorage.getDisplayValueByIndex(i)];
    }

    return ctr;
}


Thursday, 28 September 2017

Get vendor's and customer's GST number in AX 2012 R3

Hi guys,
IN GST era, It is very common term GST. So here I'm discussing how to get vendor's GST number in X++ AX 2012 R3 and It is very simple to refer below sample code.

 And similarly, you can get Customer's GST number and sometimes we get requirement from client to print warehouse or Company GST number so just refer this below job and modify as per the requirement.

Static void   getVendorGST(AccountNum     _accountNum)
{
    VendTable           vendTable;
    DirPartyTable       dirPartyTable;
    LogisticsLocation   logisticsLocation;
    TaxInformation_IN   taxInformation_IN;

    select vendTable where vendTable.AccountNum == _accountNum
        join dirPartyTable
            where dirPartyTable.RecId == vendTable.Party
        join logisticsLocation
            where logisticsLocation.RecId == dirPartyTable.PrimaryAddressLocation;


    taxInformation_IN   = TaxInformation_IN::findDefaultbyLocation(logisticsLocation.RecId);
    return TaxRegistrationNumbers_IN::find(taxInformation_IN.GSTIN).RegistrationNumber;
}

Happy DAxing......

Thursday, 31 August 2017

Reverse string in Dynamics AX.

Hi guys,
Reverse string in Dynamics AX.

static void reverseString(Args _args)
{
    int     i;
    str     temp;
    str     retVar = 'DynamicsAX';
    int     length;
    str     getvalue,RV;
    ;
    length = strLen(retVar);
    for(i=length; i>=1; i--)
    {
        temp =SubStr(retVar,i,1);
        getvalue +=temp;

        // other way with strReverse function
        RV = strReverse(retVar);
    }
    info(RV);
}

Add filter on display method on form control in AX 2012 R3

Hi guys,

Here I have added display method ("displayInternalPackingSlipId" set auto declaration as yes on form control) to display GSN number on the “VendPackingSlipJour” form. In this form main data source is “VendPackingSlipJour”.
Override context method as bellow on display method control  and modified logic as per need.

public void context()
{
    int             selectedMenu;
    formrun         fr;
    Args            ag;
    Name            strtext;
    querybuilddataSource qb1;
    queryrun    qr;
    query       q;
    PopupMenu menu = new PopupMenu(element.hWnd());
    int a = menu.insertItem('Filter By Field');
    int b = menu.insertItem('Filter By Selection');
    int c = menu.insertItem('Remove Filter');
    ;

    selectedMenu = menu.draw();
    switch (selectedMenu)
    {
    case -1: //Filter by field
            break;
    case a:
            ag = new args('SysformSearch');
            fr = new formrun(ag);
            fr.run();
            fr.wait();
    //Reading User entered value for filter process
            strtext = fr.design().controlName('FindEdit').valueStr();
            if(strtext)
            {
    //Creating a query for filter
                q   = vendPackingSlipJour_ds.query();
                qb1 = q.dataSourceTable(tablenum(VendPackingSlipJour));
                qb1 = qb1.addDataSource(TableNum(VendPackingSlipVersion));
                qb1.addLink(FieldNum(VendPackingSlipJour,Recid),FieldNum(VendPackingSlipVersion,VendPackingSlipJour));
                qb1.addRange(FieldNum(VendPackingSlipVersion,InternalPackingSlipId)).value(strtext);
                vendPackingSlipJour_ds.query(Q);
                vendPackingSlipJour_ds.executeQuery();
            }
            break;

    case b:   // Filter By Selection
            q   = vendPackingSlipJour_ds.query();
            qb1 = q.dataSourceTable(tablenum(VendPackingSlipJour));
            qb1 = qb1.addDataSource(TableNum(VendPackingSlipVersion));
            qb1.addLink(FieldNum(VendPackingSlipJour,RecId),FieldNum(VendPackingSlipVersion,VendPackingSlipJour));
            qb1.addRange(FieldNum(VendPackingSlipVersion,InternalPackingSlipId)).value(displayInternalPackingSlipId.valueStr());
            vendPackingSlipJour_ds.query(Q);
            vendPackingSlipJour_ds.executeQuery();
            break;
    case c :   // Remove Filter
            q   = new Query();
            qb1 = q.addDataSource(tablenum(VendPackingSlipJour));
            qb1.clearLinks();
            qb1.clearRanges();
            vendPackingSlipJour_ds.query(Q);
            vendPackingSlipJour_ds.removeFilter();
            break;

    Default:
            break;
    }

}

Happy DAXing. 


Thursday, 10 August 2017

Get customer email in ax 2012

Get customer email in ax 2012

static void Custermail(Args _args)
{
    LogisticsElectronicAddress          led;
    LogisticsLocation                   ll;
    CustTable                           ct;

    DirPartyLocation     dpl;
    str phone,fax,email,url;
    RecId  RecId;
    ;
    select  ct where ct .AccountNum =='ABC'
    join dpl where ct.Party == dpl.Party
    join led where led.Location == dpl.Location
    && led.IsPrimary == NoYes::Yes
    && led.Type == LogisticsElectronicAddressMethodType::Email;
    {
        email =  led.Locator;
        info(email);
    }
}

Thursday, 6 July 2017

Calculate Purchase order confirmation tax details (IGST/CGST/SGST) in AX 2009

Hi guys,

I was struggling  to calculate the GST taxes on purchase order confirmation. Here i am sharing some code to get Taxes details (IGST/CGST/SGST) in AX 2009.

static void GSTTotal(Args _args)
{
    vendPurchOrderJour vendPurchOrderJour;
    ITaxDocument taxDocument;
    ITaxDocumentComponentLineEnumerator componentLineEnumerator;
    ITaxDocumentComponentLine componentLineObject;
    ITaxDocumentMeasureEnumerator measureEnumerator;
    TaxAmount taxAmount,taxValue;
    TaxComponent_IN taxComponent;
    ;
    vendPurchOrderJour = vendPurchOrderJour::findRecId(5637291565); //Need to pass Confirmation journal recid
    taxDocument = TaxBusinessService::getTaxDocumentBySource(vendPurchOrderJour.TableId, vendPurchOrderJour.RecId);

    componentLineEnumerator = taxDocument.componentLines();

    while(componentLineEnumerator.moveNext())
    {
        componentLineObject = componentLineEnumerator.current();

        taxComponent = componentLineObject.metaData().taxComponent();
        taxValue = componentLineObject.getMeasure("Rate").value().value() * 100;
        taxAmount = componentLineObject.getMeasure("Tax Amount").value().value();

        info(strFmt("Component %1 ,Rate %2, Amount%3",taxComponent,taxValue,taxAmount));
    }
}


Happy DAXing.

Import General journal from excel in D365 F&O

 Hi Guys, Import General journal from excel in D365 F&O Code:  using System.IO; using OfficeOpenXml; using OfficeOpenXml.ExcelPackage; u...