Os valores "Inv. Discount Amount", "Unit price excl VAT" e "Line Amount excl VAT" estão incorretos numa ordem de venda que tem o imposto sobre o preço inclusivo ativado na versão indiana do Microsoft Dynamics NAV 2009

Aplica-se A
Dynamics NAV 2009

Este artigo aplica-se ao Microsoft Dynamics NAV para a região de idioma indiano (in).

Sintomas

Suponha que tem uma encomenda de vendas com impostos inclusivos sobre preços ativados na versão indiana do Microsoft Dynamics NAV 2009. Depois de executar a função Calcular Valores da Estrutura , os valores nif. IVA do preço unitário, IVA do preço unitário e NIF do Valor da Linha estão incorretos. 
Este problema ocorre nos seguintes produtos:

  • A versão indiana do Microsoft Dynamics NAV 2009 R2
  • A versão indiana do Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)

Resolução

Informações de correção

Uma correção suportada está agora disponível na Microsoft. No entanto, destina-se apenas a corrigir o problema descrito neste artigo. Aplique-o apenas a sistemas com este problema específico. Esta correção pode receber testes adicionais. Por conseguinte, se não for gravemente afetado por este problema, recomendamos que aguarde pelo próximo service pack do Microsoft Dynamics NAV ou pela próxima versão do Microsoft Dynamics NAV que contém esta correção.

Nota Em casos especiais, os custos normalmente incorridos para chamadas de suporte poderão ser cancelados se um Profissional de Suporte Técnico para o Microsoft Dynamics e produtos relacionados determinar que uma atualização específica irá resolver o problema. Os custos de suporte habituais serão aplicados a questões e problemas de suporte adicionais que não se qualificam para a atualização específica em questão.

            
          

Informações de instalação

A Microsoft fornece exemplos de programação apenas para ilustração, sem garantia expressa ou implícita. Isto inclui, mas não se limita às garantias implícitas de comercialização ou adequação a um fim específico. Este artigo parte do princípio de que está familiarizado com a linguagem de programação que está a ser demonstrada e com as ferramentas utilizadas para criar e depurar procedimentos. Os engenheiros de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para fornecer funcionalidades adicionais ou criar procedimentos para satisfazer os seus requisitos específicos.

Nota Antes de instalar esta correção, verifique se todos os utilizadores cliente do Microsoft Navision têm sessão iniciada no sistema. Isto inclui utilizadores cliente do Microsoft Navision Application Services (NAS). Deve ser o único utilizador cliente com sessão iniciada quando implementa esta correção.

Para implementar esta correção, tem de ter uma licença de programador.

Recomendamos que a conta de utilizador na janela Inícios de Sessão do Windows ou na janela Inícios de Sessão da Base de Dados seja atribuída ao ID da função "SUPER". Se não for possível atribuir à conta de utilizador o ID de função "SUPER", tem de verificar se a conta de utilizador tem as seguintes permissões:

  • A permissão Modificar para o objeto que irá alterar.
  • A permissão Executar para o objeto ID de Objeto de Sistema 5210 e para o objeto ID de Objeto do Sistema 9015.

                
Nota Não tem de ter direitos sobre os arquivos de dados, a menos que tenha de efetuar a reparação de dados.

Alterações de código

Nota Teste sempre as correções de código num ambiente controlado antes de aplicar as correções aos seus computadores de produção.
Para resolver este problema, siga estes passos:

  1. Altere o código no acionador % de Desconto de Linha – OnValidate na tabela Linha de Vendas (37) da seguinte forma:
    Código existente

    ...
    "Line Discount %" := 100;
    
    // Delete the following line.
    IF NOT "Price Inclusive of Tax" THEN
    
    "Line Discount Amount" :=
    ROUND(ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * "Line Discount %" / 100,
    Currency."Amount Rounding Precision")
    
    // Delete the following lines.
    ELSE
    "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price Incl. of Tax",Currency."Amount Rounding Precision") *
    "Line Discount %" / 100,Currency."Amount Rounding Precision");
    // End of the lines.
    ...
    

    Código de substituição

    ...
    
    "Line Discount %" := 100;
    
    "Line Discount Amount" :=
    ROUND(ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * "Line Discount %" / 100,
    Currency."Amount Rounding Precision");
    ...
    
  2. Altere o código no acionador Valor de Desconto de Linha – OnValidate na tabela Linha de Vendas (37) da seguinte forma:
    Código existente

    ...
    TESTFIELD(Quantity);
    
    // Delete the following line.
    IF NOT "Price Inclusive of Tax" THEN
    
    IF ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") <> 0 THEN
    "Line Discount %" :=
    ROUND(
    "Line Discount Amount" / ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * 100,
    0.00001)
    ELSE
    "Line Discount %" := 0
    
    // Delete the following lines.
    ELSE
    IF ROUND(Quantity * "Unit Price Incl. of Tax",Currency."Amount Rounding Precision") <> 0 THEN
    "Line Discount %" :=
    ROUND(
    "Line Discount Amount" / ROUND(Quantity * "Unit Price Incl. of Tax",Currency."Amount Rounding Precision") * 100,
    0.00001)
    ELSE
    "Line Discount %" := 0;
    // End of the lines.
    
    "Inv. Discount Amount" := 0;
    ...
    

    Código de substituição

    ...
    TESTFIELD(Quantity);
    IF ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") <> 0 THEN
    "Line Discount %" :=
    ROUND(
    "Line Discount Amount" / ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * 100,
    0.00001)
    ELSE
    "Line Discount %" := 0;
    "Inv. Discount Amount" := 0;
    ...
    
  3. Altere o código na função GetSalesPriceExclusiveTaxes na tabela Linha de Vendas (37) da seguinte forma:
    Código existente

    ...
    IF StrOrderDetails."Include Base" THEN
    BaseAmountVariable := BaseAmountVariable + Quantity;
    
    // Delete the following lines.
    IF StrOrderDetails."Include Line Discount" THEN
    BaseAmountFixed := BaseAmountFixed - "Line Discount Amount";
    IF StrOrderDetails."Include Invoice Discount" THEN BEGIN
    BaseAmountFixed := BaseAmountFixed + "Inv Discount Fixed";
    BaseAmountVariable := BaseAmountVariable - "Inv Discount Variable";
    END;
    // End of the lines.
    
    IF SalesHeader."Currency Factor" <> 0 THEN
    ...
    

    Código de substituição

    ...
    IF StrOrderDetails."Include Base" THEN
    BaseAmountVariable := BaseAmountVariable + Quantity;
    
    IF SalesHeader."Currency Factor" <> 0 THEN
    ...
    
  4. Altere o código na função CalculateStructuresPIT na tabela Linha de Vendas (37) da seguinte forma:
    Código existente

    ...
    SalesLine.MODIFY;
    
    // Delete the following lines.
    IF i < 3 THEN BEGIN
    FixedAmt := 0;
    VariableAmt := 0;
    AdjustedAmt := 0;
    DiffAdjustmentAmt := 0;
    FixedAmt := SalesLine."Unit Price Incl. of Tax" * SalesLine.Quantity;
    VariableAmt := SalesLine.Quantity;
    StrOrderLineDetails.RESET;
    StrOrderLineDetails.SETCURRENTKEY(Type,"Document Type","Document No.","Structure Code","Item No.","Line No.");
    StrOrderLineDetails.SETRANGE(Type,StrOrderLineDetails.Type::Sale);
    StrOrderLineDetails.SETRANGE("Document Type",SalesLine."Document Type");
    StrOrderLineDetails.SETRANGE("Document No.",SalesLine."Document No.");
    StrOrderLineDetails.SETRANGE("Structure Code",SalesLine."PIT Structure");
    StrOrderLineDetails.SETRANGE("Item No.",SalesLine."No.");
    StrOrderLineDetails.SETRANGE("Line No.",SalesLine."Line No.");
    StrOrderLineDetails.SETRANGE("Include PIT Calculation",TRUE);
    IF StrOrderLineDetails.FIND('-') THEN
    REPEAT
    FixedAmt -= StrOrderLineDetails.Amount;
    AdjustedAmt := AdjustedAmt + StrOrderLineDetails.Amount;
    UNTIL StrOrderLineDetails.NEXT = 0;
    
    SalesLine."Unit Price" := 0;
    IF VariableAmt <> 0 THEN BEGIN
    SalesLine."Unit Price" := ROUND((FixedAmt / VariableAmt),GetRoundingPrecisionUnitPrice);
    IF SalesLine."Unit Price" < 0 THEN
    SalesLine.FIELDERROR("Unit Price");
    IF (i = 2) AND (FixedAmt <> 0) AND (SalesLine.Quantity <> 0) THEN BEGIN
    AdjustedAmt := AdjustedAmt + (SalesLine."Unit Price" * SalesLine.Quantity);
    FixedAmt := SalesLine."Unit Price Incl. of Tax" * SalesLine.Quantity;
    DiffAdjustmentAmt := ((FixedAmt - AdjustedAmt)/SalesLine.Quantity) *
    (SalesLine."Unit Price" * SalesLine.Quantity) / (FixedAmt );
    SalesLine."Unit Price" := ROUND(SalesLine."Unit Price" - DiffAdjustmentAmt,GetRoundingPrecisionUnitPrice);
    IF SalesLine."Unit Price" < 0 THEN
    SalesLine.FIELDERROR("Unit Price");
    END;
    SalesLine.ValidateUnitPrice;
    SalesLine.ChkQtyUpdatioAfterDDPLA;
    SalesLine.MODIFY;
    IF SalesHeader."Calc. Inv. Discount (%)" THEN
    CalcInvDis.CalculateWithSalesHeader(SalesHeader,SalesLine);
    SalesLine.GET(SalesLine."Document Type",SalesLine."Document No.",SalesLine."Line No.");
    END;
    END;
    // End of the lines.
    ...
    

    Código de substituição

    ...
    SalesLine.MODIFY;
    ...
    
  5. Altere o código na função UpdateSalesLinesPIT na tabela Linha de Vendas (37) da seguinte forma:
    Código existente

    ...
    "Service Tax Amount" + "Service Tax eCess Amount" + "Service Tax SHE Cess Amount";
    MODIFY;
    ...
    

    Código de substituição

    ...
    
    "Service Tax Amount" + "Service Tax eCess Amount" + "Service Tax SHE Cess Amount";
    
    // Add the following lines.
    "Amount To Customer UPIT" := 
    "Line Amount" - "Inv. Discount Amount" + "Excise Amount" + "Tax Amount" + "Charges To Customer"; 
    // End of the lines.
    
    MODIFY;
    ...
    
  6. Altere o código na função ValidateUnitPrice na tabela Linha de Vendas (37) da seguinte forma:
    Código existente

    ...
    "Line Discount %" := 100;
    
    // Delete the following line.
    IF NOT "Price Inclusive of Tax" THEN
    
    "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * "Line Discount %" / 100,
    Currency."Amount Rounding Precision")
    
    // Delete the following lines.
    ELSE
    "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price Incl. of Tax",Currency."Amount Rounding Precision") *
    "Line Discount %" / 100,Currency."Amount Rounding Precision");
    // End of the lines.
    
    "Inv. Discount Amount" := 0;
    ...
    

    Código de substituição

    ...
    
    "Line Discount %" := 100;
    "Line Discount Amount" := ROUND(ROUND(Quantity * "Unit Price",Currency."Amount Rounding Precision") * "Line Discount %" / 100,
    Currency."Amount Rounding Precision");
    "Inv. Discount Amount" := 0;
    ...
    
  7. Altere o código na função DivideAmount em Sales - Post codeunit (80) da seguinte forma:
    Código existente 1

    ...
    IF SalesLineQty <> Quantity THEN
    
    // Delete the following lines.
    IF "Price Inclusive of Tax" THEN
    "Line Discount Amount" :=
    ROUND((SalesLineQty * "Unit Price Incl. of Tax") * "Line Discount %" / 100,Currency."Amount Rounding Precision")
    ELSE
    // End of the lines.
    
    "Line Discount Amount" :=
    ROUND("Line Amount" * "Line Discount %" / 100,Currency."Amount Rounding Precision");
    "Line Amount" := "Line Amount" - "Line Discount Amount";
    ...
    

    Código de substituição 1

    ...
    IF SalesLineQty <> Quantity THEN
    "Line Discount Amount" :=
    ROUND("Line Amount" * "Line Discount %" / 100,Currency."Amount Rounding Precision");
    "Line Amount" := "Line Amount" - "Line Discount Amount";
    ...
    

    Código existente 2

    ...
    "Bal. TDS/TCS Including SHECESS",Currency."Amount Rounding Precision");
    
    // Delete the following lines.
    IF "Price Inclusive of Tax" THEN BEGIN
    "Amount To Customer UPIT" := SalesLineQty * "Unit Price";
    GLSetup.GET;
    StrOrdLineDetails2.RESET;
    StrOrdLineDetails2.SETRANGE(Type,StrOrdLineDetails2.Type::Sale);
    StrOrdLineDetails2.SETRANGE("Document Type","Document Type");
    StrOrdLineDetails2.SETRANGE("Document No.","Document No.");
    StrOrdLineDetails2.SETRANGE("Line No.","Line No.");
    StrOrdLineDetails2.SETRANGE("Include PIT Calculation",TRUE);
    IF StrOrdLineDetails2.FINDSET THEN
    REPEAT
    SalesLine2.GET("Document Type","Document No.","Line No.");
    IF StrOrdLineDetails2."Tax/Charge Type" = StrOrdLineDetails2."Tax/Charge Type"::Excise THEN
    "Amount To Customer UPIT" += "Excise Amount";
    IF StrOrdLineDetails2."Tax/Charge Type" = StrOrdLineDetails2."Tax/Charge Type"::"Sales Tax" THEN
    "Amount To Customer UPIT" += "Tax Amount";
    IF StrOrdLineDetails2."Tax/Charge Type" = StrOrdLineDetails2."Tax/Charge Type"::Charges THEN BEGIN
    IF QuantityType = QuantityType::General THEN
    "Amount To Customer UPIT" += ROUND(StrOrdLineDetails2.Amount * SalesLineQty / Quantity,
    Currency."Amount Rounding Precision");
    IF QuantityType = QuantityType::Invoicing THEN
    "Amount To Customer UPIT" += ROUND(StrOrdLineDetails2.Amount * SalesLine2."Qty. to Invoice" / SalesLine2.Quantity,
    Currency."Amount Rounding Precision");
    IF QuantityType = QuantityType::Shipping THEN
    "Amount To Customer UPIT" += ROUND(StrOrdLineDetails2.Amount * SalesLine2."Qty. to Ship" / SalesLine2.Quantity,
    Currency."Amount Rounding Precision");
    END;
    UNTIL StrOrdLineDetails2.NEXT = 0;
    "Total UPIT Amount" := ROUND("Total UPIT Amount" * SalesLineQty / Quantity,Currency."Amount Rounding Precision");
    END;
    // End of the lines.
    
    END;
    END;
    ...
    

    Código de substituição 2

    ...
    "Bal. TDS/TCS Including SHECESS",Currency."Amount Rounding Precision");
    
    // Add the following lines.
    IF "Price Inclusive of Tax" THEN
    "Amount To Customer UPIT" :=
    ROUND("Line Amount" - "Inv. Discount Amount" + "Excise Amount" + "Tax Amount" +
    "Charges To Customer", Currency."Amount Rounding Precision");
    // End of the lines.
    
    END;
    END;
    ...
    
  8. Altere o código na função RoundAmount em Sales - Post codeunit (80) da seguinte forma:
    Código existente

    ...
    TotalSalesLineLCY."Amount To Customer";
    "Charges To Customer" :=
    ...
    

    Código de substituição

    ...
    TotalSalesLineLCY."Amount To Customer";
    
    // Add the following lines.
    "Amount To Customer UPIT" :=
    ROUND(
    CurrExchRate.ExchangeAmtFCYToLCY(
    UseDate,SalesHeader."Currency Code",
    TotalSalesLine."Amount To Customer UPIT",SalesHeader."Currency Factor")) -
    TotalSalesLineLCY."Amount To Customer UPIT";
    "Total UPIT Amount" :=
    ROUND(
    CurrExchRate.ExchangeAmtFCYToLCY(
    UseDate,SalesHeader."Currency Code",
    TotalSalesLine."Total UPIT Amount",SalesHeader."Currency Factor")) -
    TotalSalesLineLCY."Total UPIT Amount";
    // End of the lines.
    
    "Charges To Customer" :=
    ...
    
  9. Altere o código na função ReverseAmount em Sales – Post codeunit (80) da seguinte forma:
    Código existente

    ...
    "Amount To Customer" := -"Amount To Customer";
    "Charges To Customer" := -"Charges To Customer";
    ...
    

    Código de substituição

    ...
    "Amount To Customer" := -"Amount To Customer";
    
    // Add the following lines.
    Amount To Customer UPIT" := -"Amount To Customer UPIT";
    Total UPIT Amount" := -"Total UPIT Amount";
    // End of the lines.
    
    "Charges To Customer" := -"Charges To Customer";
    ...
    
  10. Altere o código na função InvoiceUPITRounding em Sales - Post codeunit (80) da seguinte forma:
    Código existente 1

    ...
    EXIT;
    
    // Delete the following line.
    UPITRoundingAmount := TotalSalesLine."Total UPIT Amount" - ROUND(TotalSalesLine."Amount To Customer UPIT");
    
    IF UPITRoundingAmount <> 0 THEN BEGIN
    ...
    

    Código de substituição 1

    ...
    EXIT;
    
    // Add the following line.
    UPITRoundingAmount := TotalSalesLine."Amount To Customer UPIT" - ROUND(TotalSalesLine."Amount To Customer UPIT");
    
    IF UPITRoundingAmount <> 0 THEN BEGIN
    ...
    

    Código existente 2

    ...
    "UPIT Rounding Inserted" := TRUE;
    
    // Delete the following line.
    IF SalesHeader."Prices Including VAT" THEN
    
    VALIDATE("Unit Price",UPITRoundingAmount)
    ...
    

    Código de substituição 2

    ...
    "UPIT Rounding Inserted" := TRUE;
    
    // Add the following line.
    IF SalesHeader."Price Inclusive of Taxes" THEN
    
    VALIDATE("Unit Price",UPITRoundingAmount)
    ...
    

Pré-requisitos

Tem de ter um dos seguintes produtos instalados para aplicar esta correção:

  • A versão indiana do Microsoft Dynamics NAV 2009 R2
  • A versão indiana do Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)

Informações de remoção

Não é possível remover esta correção.

Estado

A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".

Nota Este é um artigo "PUBLICAÇÃO RÁPIDA" criado diretamente a partir da organização de suporte da Microsoft. As informações aqui contidas são fornecidas tal como estão em resposta a problemas emergentes. Como resultado da velocidade de disponibilização, os materiais podem incluir erros tipográficos e podem ser revistos em qualquer altura sem aviso prévio. Veja Termos de Utilização para outras considerações.