Tính toán VAT không chính xác nếu đảo ngược phí vat mua hóa đơn có một số dòng liên kết đến công việc khác nhau trong Microsoft Dynamics NAV

Áp dụng cho
Dynamics NAV 2009 Microsoft Dynamics NAV 5.0

Bài viết này áp dụng cho Microsoft Dynamics NAV cho tất cả các quốc gia và tất cả các ngôn ngữ bản địa.

Triệu chứng

Khi bạn gửi một đảo ngược phí giá trị gia tăng thuế (VAT) mua hóa đơn có chứa một số dòng và các dòng liên kết đến công việc khác nhau trong Microsoft Dynamics NAV, tính toán VAT không chính xác. Sự cố này xảy ra trong các sản phẩm sau:

  • Microsoft Dynamics NAV 2009 R2
  • Microsoft Dynamics NAV 2009 Gói Dịch vụ 1
  • Microsoft Dynamics NAV 5.0 Gói Dịch vụ 1

Giải pháp

Thông tin cập nhật nóng

Hotfix được hỗ trợ hiện có sẵn từ Microsoft. Tuy nhiên, nó chỉ là nhằm sửa chữa vấn đề được mô tả trong bài viết này. Áp dụng nó chỉ cho hệ thống đang gặp này cụ thể vấn đề. Hotfix này có thể nhận được thử nghiệm bổ sung. Do đó, nếu bạn không bị ảnh hưởng nghiêm trọng bởi sự cố này, chúng tôi khuyên bạn nên đợi gói dịch vụ Microsoft Dynamics NAV 2009 tiếp theo hoặc phiên bản Microsoft Dynamics NAV tiếp theo có chứa hotfix này.

Lưu ý Trong trường hợp đặc biệt, các khoản phí thường phát sinh đối với các cuộc gọi hỗ trợ có thể bị hủy nếu Chuyên gia Hỗ trợ Kỹ thuật dành cho Microsoft Dynamics và các sản phẩm liên quan xác định rằng một bản cập nhật cụ thể sẽ giải quyết sự cố của bạn. Chi phí hỗ trợ thông thường sẽ áp dụng cho các câu hỏi và sự cố hỗ trợ bổ sung không đủ điều kiện cho bản cập nhật cụ thể được đề cập.

          

Thông tin cài đặt

Microsoft chỉ cung cấp các ví dụ lập trình để minh họa mà không cần bảo hành dù là rõ ràng hay ngụ ý. Điều này bao gồm, nhưng không giới hạn ở, bảo hành ngụ ý về khả năng bán được hoặc sự thích hợp cho một mục đích cụ thể. Bài viết này giả định rằng bạn đã quen thuộc với ngôn ngữ lập trình đang được chứng minh và với các công cụ được sử dụng để tạo và gỡ lỗi thủ tục. Kỹ sư hỗ trợ của Microsoft có thể giúp giải thích chức năng của một quy trình cụ thể. Tuy nhiên, họ sẽ không sửa đổi các ví dụ này để cung cấp chức năng bổ sung hoặc xây dựng các thủ tục để đáp ứng các yêu cầu cụ thể của bạn.

Lưu ý Trước khi bạn cài đặt hotfix này, hãy xác minh rằng tất cả người dùng máy khách Microsoft Navision đã được đăng xuất khỏi hệ thống. Điều này bao gồm người dùng máy khách Dịch vụ Ứng dụng Microsoft Navision (NAS). Bạn nên là người dùng khách duy nhất đăng nhập khi bạn thực hiện hotfix này.

Để thực hiện hotfix này, bạn phải có giấy phép nhà phát triển.

Chúng tôi khuyên bạn nên gán tài khoản người dùng trong cửa sổ Đăng nhập Windows hoặc trong cửa sổ Đăng nhập Cơ sở dữ liệu. Nếu tài khoản người dùng không thể được gán ID vai trò "SIÊU", bạn phải xác minh rằng tài khoản người dùng có các quyền sau đây:

  • Quyền Sửa đổi đối với đối tượng mà bạn sẽ thay đổi.
  • Quyền Thực thi đối với đối tượng ID Đối tượng Hệ thống 5210 và đối với đối tượng ID Đối tượng Hệ thống 9015.

                
Lưu ý Bạn không phải có quyền đối với các kho dữ liệu trừ khi bạn phải thực hiện sửa chữa dữ liệu.

Thay đổi mã

Lưu ý Luôn kiểm tra các bản sửa lỗi mã trong môi trường được kiểm soát trước khi bạn áp dụng các bản sửa lỗi cho máy tính sản xuất của bạn.
Để giải quyết vấn đề này, thay đổi mã purch.-Post codeunit (90). Để thực hiện điều này, hãy làm theo các bước sau:

  1. Thêm biến cục bộ trong trình kích hoạt OnRun, rồi xác định biến số như sau:

    • Name:TempRevChargeVATAmountLine
    • DataType:Record
    • Loại con:Dòng Số tiền VAT

    Lưu ý Bật thuộc tính Tạm thời.

  2. Thêm biến cục bộ trong trình kích hoạt OnRun, rồi xác định biến số như sau:

    • Name:TempRevChargeVATAmountLine2
    • DataType:Record
    • Loại con:Dòng Số tiền VAT

    Lưu ý Bật thuộc tính Tạm thời.

  3. Thay đổi mã trình kích hoạt OnRun như sau:
    Mã hiện có

    ....

    CASE InvPostingBuffer[1]."VAT Calculation Type" OF
      InvPostingBuffer[1]."VAT Calculation Type"::"Reverse Charge VAT":
    //delete lines begin    
        BEGIN
          VATPostingSetup.GET(
            InvPostingBuffer[1]."VAT Bus. Posting Group",InvPostingBuffer[1]."VAT Prod. Posting Group");
          InvPostingBuffer[1]."VAT Amount" :=
            ROUND(
              InvPostingBuffer[1].Amount * VATPostingSetup."VAT %" / 100);
          InvPostingBuffer[1]."VAT Amount (ACY)" :=
            ROUND(
              (InvPostingBuffer[1]."Amount (ACY)" * VATPostingSetup."VAT %" / 100),Currency."Amount Rounding Precision");
        END
    //delete lines end  
      InvPostingBuffer[1]."VAT Calculation Type"::"Sales Tax":
    

    Mã thay thế

    ...
    CASE InvPostingBuffer[1]."VAT Calculation Type" OF
    InvPostingBuffer[1]."VAT Calculation Type"::"Reverse Charge VAT":
    
    // Add the following line.
    CalcRevChargeVATAmounts(InvPostingBuffer[1],TempRevChargeVATAmountLine,TempRevChargeVATAmountLine2);
    
    InvPostingBuffer[1]."VAT Calculation Type"::"Sales Tax":
    ...
    
    
  4. Thêm hàm CalcRevChargeVATAmount mới. Để thực hiện điều này, hãy làm theo các bước sau:

    1. Đặt thuộc tính Local thành Yes.

    2. Thêm tham số cục bộ trong hàm CalcRevChargeVATAmount, rồi xác định tham số như sau:

      • Var: Có
      • Name:InvoicePostBuffer
      • DataType:Record
      • Loại con:Bài đăng hóa đơn. Bộ đệm
    3. Thêm tham số cục bộ trong hàm CalcRevChargeVATAmount, rồi xác định tham số như sau:

      • Var: Có
      • Name:TempRevChargeVATAmountLine
      • DataType:Record
      • Loại con:Dòng Số tiền VAT
    4. Thêm biến cục bộ trong hàm CalcRevChargeVATAmount, rồi xác định biến số như sau:

      • Tên:VATBase
      • DataType:Decimal
    5. Thêm biến cục bộ trong hàm CalcRevChargeVATAmount, rồi xác định biến số như sau:

      • Tên:TotalVATBase
      • DataType:Decimal
    6. In the created CalcRevChargeVATAmount(VAR InvoicePostBuffer: Record "Invoice Post. Buffer"; VAR TempRevChargeVATAmountLine : Ghi lại hàm "Dòng Số tiền VAT"), thêm mã sau đây:

      VATBase := InvoicePostBuffer.Amount;
      TotalVATBase := GetTotalVATBase(TempRevChargeVATAmountLine,InvoicePostBuffer);
      InvoicePostBuffer."VAT Amount" := GetVATAmount(TotalVATBase + VATBase) - GetVATAmount(TotalVATBase);
      SetTotalVATBase(TempRevChargeVATAmountLine,InvoicePostBuffer,VATBase);
      
  5. Thêm hàm CalcRevChargeVATAmounts mới. Để thực hiện điều này, hãy làm theo các bước sau:

    1. Đặt thuộc tính Local thành Yes.

    2. Thêm tham số cục bộ trong hàm CalcRevChargeVATAmounts, rồi xác định tham số như sau:

      • Var: Có
      • Name:InvoicePostBuffer
      • DataType:Record
      • Loại con:Bài đăng hóa đơn. Bộ đệm
    3. Thêm tham số cục bộ trong hàm CalcRevChargeVATAmounts, rồi xác định tham số như sau:

      • Var: Có
      • Name:TempRevChargeVATAmountLine
      • DataType:Record
      • Loại con:Dòng Số tiền VAT
    4. Thêm tham số cục bộ trong hàm CalcRevChargeVATAmounts, rồi xác định tham số như sau:

      • Var: Có
      • Name:TempRevChargeVATAmountLine2
      • DataType:Record
      • Loại con:Dòng Số tiền VAT
    5. Thêm biến cục bộ trong hàm CalcRevChargeVATAmounts, rồi xác định biến số như sau:

      • Tên:ACYInvoicePostBuffer
      • DataType:Record
      • Loại con:Bài đăng hóa đơn. Bộ đệm

      Lưu ý Bật thuộc tính Tạm thời.

    6. In the created CalcRevChargeVATAmounts(VAR InvoicePostBuffer: Record "Invoice Post. Buffer"; VAR TempRevChargeVATAmountLine : Ghi lại hàm "Dòng Số tiền VAT"), thêm mã sau đây:

      CalcRevChargeVATAmount(InvoicePostBuffer,TempRevChargeVATAmountLine);
      CopyACYAmounts(InvoicePostBuffer,ACYInvoicePostBuffer);
      CalcRevChargeVATAmount(ACYInvoicePostBuffer,TempRevChargeVATAmountLine2);
      InvoicePostBuffer."VAT Amount (ACY)" := ACYInvoicePostBuffer."VAT Amount";
      
      
  6. Thêm hàm FillVATAmountLine mới. Để thực hiện điều này, hãy làm theo các bước sau:

    1. Đặt thuộc tínhLocal thành Yes.

    2. Thêm tham số cục bộ trong hàm FillVATAmountLine, rồi xác định tham số như sau:

      • Var: Có
      • Name:TempRevChargeVATAmountLine
      • DataType:Record
      • Loại con:Dòng Số tiền VAT
    3. Thêm tham số cục bộ trong hàm FillVATAmountLine, rồi xác định tham số như sau:

      • Var: Không
      • Name:InvoicePostBuffer
      • DataType:Record
      • Loại con:Bài đăng hóa đơn. Bộ đệm
    4. Trong FillVATAmountLine đã tạo(VAR TempRevChargeVATAmountLine: Ghi "Dòng số tiền VAT"; InvoicePostBuffer : Ghi lại "Hóa đơn đăng bài. Đệm") chức năng, thêm mã sau đây:

      VATPostingSetup.GET(InvoicePostBuffer."VAT Bus. Posting Group",InvoicePostBuffer."VAT Prod. Posting Group");
      TempRevChargeVATAmountLine.INIT;
      TempRevChargeVATAmountLine."VAT Identifier" := VATPostingSetup."VAT Identifier";
      TempRevChargeVATAmountLine."VAT Calculation Type" := VATPostingSetup."VAT Calculation Type";
      TempRevChargeVATAmountLine."Tax Group Code" := InvoicePostBuffer."Tax Group Code";
      TempRevChargeVATAmountLine."Use Tax" := InvoicePostBuffer."Use Tax";
      TempRevChargeVATAmountLine.Positive := InvoicePostBuffer.Amount > 0;
      
      
  7. Thêm hàm SetTotalVATBase mới. Để thực hiện điều này, hãy làm theo các bước sau:

    1. Đặt thuộc tính Local thành Yes.

    2. Thêm tham số cục bộ trong hàm SetTotalVATBase, rồi xác định tham số như sau:

      • Var: Có
      • Name:TempRevChargeVATAmountLine
      • DataType:Record
      • Loại con:Dòng Số tiền VAT
    3. Thêm tham số cục bộ trong hàm SetTotalVATBase, rồi xác định tham số như sau:

      • Var: Không
      • Name:InvoicePostBuffer
      • DataType:Record
      • Loại con:Bài đăng hóa đơn. Bộ đệm
    4. Thêm tham số cục bộ trong hàm SetTotalVATBase, rồi xác định tham số như sau:

      • Var: Không
      • Tên:VATBase
      • DataType:Decimal
    5. Trong SetTotalVATBase(VAR TempRevChargeVATAmountLine: Ghi "Dòng Số tiền VAT"; InvoicePostBuffer: Ghi lại "Hóa đơn đăng bài. Bộ đệm"; VATBase : D), thêm mã sau đây:

      FillVATAmountLine(TempRevChargeVATAmountLine,InvoicePostBuffer);
      IF NOT TempRevChargeVATAmountLine.FIND THEN
      TempRevChargeVATAmountLine.INSERT;
      TempRevChargeVATAmountLine."VAT Base" += VATBase;
      TempRevChargeVATAmountLine.MODIFY;
      
      
  8. Thêm hàm GetTotalVATBase mới. Để thực hiện điều này, hãy làm theo các bước sau:

    1. Đặt thuộc tính Local thành Yes.

    2. Thêm tham số cục bộ trong hàm GetTotalVATBase, rồi xác định tham số như sau:

      • Var: Có
      • Name:TempRevChargeVATAmountLine
      • DataType:Record
      • Loại con:Dòng Số tiền VAT
    3. Thêm tham số cục bộ trong hàm GetTotalVATBase, rồi xác định tham số như sau:

      • Var: Không
      • Name:InvoicePostBuffer
      • DataType:Record
      • Loại con:Bài đăng hóa đơn. Bộ đệm
    4. Đặt giá trị trả về trong hàm GetTotalVATBase, rồi xác định giá trị như sau:

      • Tên:VATBase
      • Kiểu Trả về:Thập phân
    5. In the created GetTotalVATBase(VAR TempRevChargeVATAmountLine: Record "VAT Amount Line"; InvoicePostBuffer : Ghi "Hóa đơn đăng bài. Đệm") VATBase chức năng, thêm mã sau đây:

      FillVATAmountLine(TempRevChargeVATAmountLine,InvoicePostBuffer);
      IF TempRevChargeVATAmountLine.FIND THEN
      VATBase := TempRevChargeVATAmountLine."VAT Base";
      
      
  9. Thêm hàm CopyACYAmounts mới. Để thực hiện điều này, hãy làm theo các bước sau:

    1. Đặt thuộc tính Local thành Yes.

    2. Thêm tham số cục bộ trong hàm CopyACYAmounts, rồi xác định tham số như sau:

      • Var: Không
      • Tên:FromInvoicePostBuffer
      • DataType:Record
      • Loại con:Bài đăng hóa đơn. Bộ đệm
    3. Thêm tham số cục bộ trong hàm CopyACYAmounts, rồi xác định tham số như sau:

      • Var: Có
      • Tên:ToInvoicePostBuffer
      • DataType:Record
      • Loại con:Bài đăng hóa đơn. Bộ đệm
    4. Trong CopyACYAmounts đã tạo(FromInvoicePostBuffer : Ghi "Bài đăng hóa đơn. Bộ đệm"; VAR ToInvoicePostBuffer : Ghi lại "Invoice Post. Buffer") chức năng, thêm mã sau đây:

      ToInvoicePostBuffer := FromInvoicePostBuffer;
      ToInvoicePostBuffer.Amount := FromInvoicePostBuffer."Amount (ACY)";
      
  10. Thêm hàm GetVATAmount mới. Để thực hiện điều này, hãy làm theo các bước sau:

    1. Đặt thuộc tính Local thành Yes.

    2. Thêm tham số cục bộ trong hàm GetVATAmount, rồi xác định tham số như sau:

      • Var: Không
      • Tên:VATBase
      • DataType:Decimal
    3. Đặt giá trị trả về trong hàm GetVATAmount, rồi xác định giá trị như sau:

      • Kiểu Trả về:Thập phân
    4. Trong GetVATAmount(VATBase : Decimal) đã tạo: Hàm Decimal, hãy thêm mã sau đây:

      EXIT(ROUND(VATBase * VATPostingSetup."VAT %" / 100));
      

Điều kiện tiên quyết

Bạn phải cài đặt một trong các sản phẩm sau để áp dụng hotfix này:

  • Microsoft Dynamics NAV 2009 R2
  • Microsoft Dynamics NAV 2009 Gói Dịch vụ 1
  • Microsoft Dynamics NAV 5.0 Gói Dịch vụ 1

Loại bỏ thông tin

Bạn không thể loại bỏ hotfix này.

Trạng thái

Microsoft đã xác nhận rằng đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong mục "áp dụng cho".

Lưu ý Đây là bài viết "PHÁT HÀNH NHANH" được tạo trực tiếp từ trong tổ chức hỗ trợ của Microsoft. Thông tin có trong tài liệu này được cung cấp tương tự để đáp ứng các vấn đề mới xuất hiện. Do tốc độ làm cho nó có sẵn, các tài liệu có thể bao gồm lỗi đánh máy và có thể được sửa đổi bất cứ lúc nào mà không cần thông báo. Hãy xem Điều khoản Sử dụng để biết những điều cần cân nhắc khác.