Buscar en este blog

domingo, 17 de enero de 2016

Calcular impuestos en ordenes de venta por código X++ en Dynamics Ax 2012 R3

En este post se muestra cómo calcular los impuestos de una orden de venta para los casos:

  1. cuando ya fue facturada
  2. cuando no ha sido facturada
  3. por línea de venta con base en código de impuestos
  4. por remisión por código de impuestos en artículo
  5. por remisión por tipo de impuesto


1. Para calcular impuestos de las líneas de una factura debemos buscarlos en la tabla TaxTrans, tanto para factura de productos como para facturas de servicios.

static void impuestosEnFactura(Args _args)
{
    TaxTrans            taxTrans;
    CustInvoiceJour     custInvoiceJour;
    CustInvoiceTrans    custInvoiceTrans;
   
    //RecId del diario de factura 
    custInvoiceJour = custInvoiceJour::findRecId( 5637149082);
   
    //Tomando en cuenta los campos por los que se relacionan las líneas
    //con el diario
    while select custInvoiceTrans
        where custInvoiceTrans.InvoiceId == custInvoiceJour.InvoiceId &&
              custInvoiceTrans.SalesId == custInvoiceJour.SalesId &&
              custInvoiceTrans.InvoiceDate == custInvoiceJour.InvoiceDate &&
              custInvoiceTrans.numberSequenceGroup == custInvoiceJour.numberSequenceGroup
    {
        while select taxTrans
        where taxTrans.InventTransId == custInvoiceTrans.InventTransId
        {
            //El campo TaxAmount es el importe del impuesto,
            //el campo TaxValue es el porcentaje de impuesto
            info( strFmt("Impuesto de línea: %1" , taxTrans.TaxAmount));
        }
    }

}

2. Cuando la orden de venta no ha sido facturada y por consiguiente, no se han registrado los impuestos en la tabla TaxTrans, podemos auxilarnos de la clase SalesTotals, el ejemplo en código seria:

static void impuestosPorOrdenVenta(Args _args)
{
    TmpTaxWorkTrans             tmpTax;
    SalesTable                  salesTable;
    SalesTotals                 salesTotals;
    salesTable  = SalesTable::find( '000735');  //Id de orden de venta
   
    //Se usa la clase SalesTotals para calcular impuestos
    //Esta clase es la que llena el formulario de Totales en una
    //orden de venta
    salesTotals = SalesTotals::construct(salesTable);
    //Calcula el impuesto
    salesTotals.calc();
    //Carga la tabla tmpTaxWorkTrans con los impuestos calculador
    tmpTax.setTmpData(salesTotals.tax().tmpTaxWorkTrans());
    //Mostramos el monto del impuesto(TaxAmount) y el porcentaje(TaxValue)
    while select tmpTax
    {
        info( strFmt('Porcentaje aplicado: %1, Monto: %2' , tmpTax.showTaxValue(), tmpTax.TaxAmount));
    }

}

En caso de que únicamente se requiera el cálculo de impuestos por ciertas líneas de la orden de venta y con base en ciertas cantidades, como puede ser el caso de únicamente calcular los impuestos por una remisión parcial, se deben hacer los cálculos para dividir ese impuesto total por línea entre la cantidad entregada de la remisión (campo Qty).

3. También es posible calcular los impuestos por artículo de acuerdo al grupo de impuestos de los artículos y a las cantidades vendidas o entregadas. Un ejemplo se muestra en el código siguiente:

static void impuestosPorTipoImpuesto(Args _args)
{
    TaxOnItem       taxOnItem;
    TaxGroupData    taxGroupData;
    real            taxAmount;
    TaxValue        taxValue;
    SalesLine       salesLine;
    SalesTable      salesTable;
   
    salesTable  = SalesTable::find( '000754');
   
    while select salesLine
        where salesLine.SalesId == salesTable.SalesId
    {
        if(salesLine.TaxItemGroup && salesLine.TaxGroup && salesLine.LineAmount != 0)
        {
            while select taxOnItem
                where taxOnItem.TaxItemGroup == salesline.TaxItemGroup
            {
                while select taxGroupData
                    where taxGroupData.TaxGroup == salesline.TaxGroup
                        && taxGroupData.TaxCode  == taxOnItem.TaxCode
                {
                    TaxValue  =  TaxData::find(taxOnItem.TaxCode, Systemdateget(), 0 ).TaxValue;
                    TaxAmount = (salesline.LineAmount * TaxValue) / 100;
                           
                    info( strFmt('Porcentaje aplicado: %1, Monto: %2' , TaxValue, TaxAmount));
                }
               
            }
        }
    }

}

4. Para el caso de calcular los impuestos de una remisión, el código quedaría como sigue:

static void impuestosPorTipoImpuestoRemision(Args _args)
{
    TaxOnItem       taxOnItem;
    TaxGroupData    taxGroupData;
    real            taxAmount;
    TaxValue        taxValue;
    SalesLine       salesLine;
    //SalesTable      salesTable;
    Amount          montoRealDeLinea;
   
    CustPackingSlipJour     custPackingSlipJour;
    CustPackingSlipTrans    custPackingSlipTrans;
   
    //RecId del diario de remisión
    custPackingSlipJour = CustPackingSlipJour::findRecId( 35637161119);
   
    //Buscando las líneas de la remisión de acuerdo a la relación física de las tablas
    while select custPackingSlipTrans
        where custPackingSlipTrans.PackingSlipId == custPackingSlipJour.PackingSlipId &&
              custPackingSlipTrans.SalesId == custPackingSlipJour.SalesId &&
              custPackingSlipTrans.DeliveryDate == custPackingSlipJour.DeliveryDate
    {
        salesLine = custPackingSlipTrans.salesLine();
       
        if(salesLine.TaxItemGroup && salesLine.TaxGroup && salesLine.LineAmount != 0 && custPackingSlipTrans.Qty != 0 )
        {
            while select taxOnItem
                where taxOnItem.TaxItemGroup == salesline.TaxItemGroup
            {
                while select taxGroupData
                    where taxGroupData.TaxGroup == salesline.TaxGroup
                        && taxGroupData.TaxCode  == taxOnItem.TaxCode
                {
                    TaxValue  =  TaxData::find(taxOnItem.TaxCode, Systemdateget(), 0 ).TaxValue;
                   
                    //Para el cálculo del impuesto por línea es necesario conocer el monto al
                    //que le vamos a  aplicar el impuesto, en este caso es el precio unitario de
                    //la línea de venta por la cantidad de la remisión
                    montoRealDeLinea = salesline.SalesPrice * custPackingSlipTrans.Qty;
                   
                    TaxAmount = (montoRealDeLinea * TaxValue) / 100;
                           
                    info( strFmt('Porcentaje aplicado: %1, Monto: %2' , TaxValue, TaxAmount));
                }
               
            }
        }
    }

}

 

5. Calculando los impuestos de una remisión por tipo de impuesto

static void impuestosPorOrdenVentaTipoImpuesto(Args _args)
{
    TmpTaxWorkTrans         tmpTax;
    SalesTotals             salesTotals;
    CustPackingSlipJour     custPackingSlipJour;
    CustPackingSlipTrans    custPackingSlipTrans;
    TaxAmount               impuestoAvCast;
 
    //RecId del diario de remisión
    custPackingSlipJour = CustPackingSlipJour::findRecId( 35637161119);
   
    salesTotals = SalesTotals::construct(custPackingSlipJour.salesTable());
    salesTotals.calc();
    tmpTax.setTmpData(salesTotals.tax().tmpTaxWorkTrans());
   
    //Por cada custPackingSlipTrans calculando el ieps
    while select custPackingSlipTrans
        where custPackingSlipTrans.PackingSlipId == custPackingSlipJour.PackingSlipId &&
              custPackingSlipTrans.SalesId == custPackingSlipJour.SalesId &&
              custPackingSlipTrans.DeliveryDate == custPackingSlipJour.DeliveryDate
    {
        while select tmpTax
            where tmpTax.InventTransId == custPackingSlipTrans.InventTransId &&
                  tmpTax.TaxCode == "AV_CAST"
        {
            //solo avcast, por línea de remisión, el resultado lo manda negativo
            impuestoAvCast = tmpTax.TaxAmount/custPackingSlipTrans.Qty;
            info( strFmt("ieps: %1" , impuestoAvCast));
        }
    }

}

Finalmente también tenemos otra opción usando la clase Tax, como se muestra en el post de "Calcular los impuestos de una línea de venta o de compra por código X++ en AX 2012".


Post relacionados:
Reportes SQL Reporting services (SSRS) en Microsoft Dynamics Ax 2012
Saldo de cuenta contable por dimension
Saldo de cuenta contable


Y por cierto, acuérdate de darle click a algún anuncio si el post te sirvió de algo.


No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 




No hay comentarios.:

Publicar un comentario