Modificar la fecha o la descripción de la contratación en Navision o Business Central

Introducción/Explicación/Descargo de responsabilidad: Hay muy buenas razones por las que en Navision y Business Central, así como en la mayoría de los programas de contabilidad, como Datev, Diamand y HS, las entradas no se pueden modificar posteriormente. La más importante es, por ejemplo, la GoB, los principios de contabilidad generalmente aceptados. Estos también están establecidos por ley. Esta solución para la corrección posterior de una fecha de contabilización se refiere, por ejemplo, al artículo 146, apartado 4, del AO y al artículo 239, apartado 3. Según estas disposiciones, al modificar los registros, debe poder determinarse el contenido original del registro. Si es necesario realizar modificaciones, debe garantizarse su identificación, de modo que quede claro que se ha modificado el registro original.
Esta función para Navision o Business Central garantiza -dentro de ciertos límites- que
- No se modifiquen los diarios contables, es decir, que desde el diario contable Navision Fibu y el diario de artículos se pueda seguir leyendo cuándo se creó el asiento original.
- La propia transacción ("fecha de contabilización modificada") se introduzca en la nota de factura.

§El artículo 146 (1) AO y el artículo 239 (2) HGB exigen el principio de una contabilidad ordenada y puntual. Según ambos apartados, los registros deben ser completos, correctos, puntuales y ordenados. Y aquí es exactamente donde entra en juego mi función de corrección para Navision o Business Central. Por supuesto, no sirve para mover transacciones de un lado a otro a voluntad. Esto ya está prohibido por la seguridad incorporada de que la nueva fecha de contabilización debe encontrarse dentro del intervalo de contabilización permitido, de modo que no se puede, por ejemplo, retrotraer una factura a un período contable ya comunicado por UVA. Se utiliza para contabilizar retroactivamente en la fecha correcta una factura que se contabilizó accidentalmente en una fecha incorrecta.

Para estar seguro, debería discutir este procedimiento con su auditor antes de integrar esta función en su Navision / Business Central.

Si también desea cambiar la descripción de la reserva, sólo tiene que ampliar la unidad de código para ello. O dirígete a mí.

Esta función de Navision / Business Central se ha creado de esta forma sin cambios a partir de una solicitud concreta de un cliente de un Navision 2009r2 (un Navision 4.03 lógico), por lo que es algo individual, por ejemplo, con la fecha de contabilización en las líneas de la factura de venta. Pero tal como está aquí, también es colo 🙂 .

OBJECT Codeunit 50003 Change Posting Date
{
  OBJECT-PROPERTIES
  {
    Date=02.04.22;
    Time=07:51:44;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    Permissions=TableData 17=m,
                TableData 21=m,
                TableData 32=m,
                TableData 112=m,
                TableData 113=m,
                TableData 169=m,
                TableData 203=m,
                TableData 254=m,
                TableData 379=m,
                TableData 5802=m;
    OnRun=BEGIN
          END;

  }
  CODE
  {
    VAR
      GLentry@1119455019 : Record 17;
      GLentry2@1119455018 : Record 17;
      VATentry@1119455017 : Record 254;
      VATentry2@1119455016 : Record 254;
      CustLedgEntry@1119455015 : Record 21;
      CustLedgEntry2@1119455014 : Record 21;
      DetCustLedgEntry@1119455013 : Record 379;
      DetCustLedgEntry2@1119455012 : Record 379;
      ItemLedgEntry@1119455011 : Record 32;
      ItemLedgEntry2@1119455010 : Record 32;
      ValueEntry@1119455009 : Record 5802;
      ValueEntry2@1119455008 : Record 5802;
      ResLedgEntry@1119455007 : Record 203;
      ResLedgEntry2@1119455006 : Record 203;
      JobLedgEntry@1119455005 : Record 169;
      JobLedgEntry2@1119455004 : Record 169;
      GenJrnCheckLine@1119455000 : Codeunit 11;
      Window@1119455020 : Dialog;
      NewPostingDate@1119455021 : Date;

    PROCEDURE GetNewPostDate@1119455002(pInitPostingDate@1119455000 : Date) : Date;
    BEGIN
      Window.OPEN('Neues Buchungsdatum: #1##########');
      Window.INPUT(1,pInitPostingDate);
      Window.CLOSE;
      EXIT(pInitPostingDate);
    END;

    PROCEDURE ChangeInvoicePostingDate@1119455000(pSalesInvHeader@1119455000 : Record 112);
    VAR
      SalesInvoiceLine@1119455001 : Record 113;
      PaymentTerms@1119455002 : Record 3;
      SalesCommentLines@1119455003 : Record 44;
    BEGIN
      NewPostingDate := GetNewPostDate(pSalesInvHeader."Posting Date");
      IF NewPostingDate = pSalesInvHeader."Posting Date" THEN
        EXIT;
      IF GenJrnCheckLine.DateNotAllowed(NewPostingDate) THEN;

      SalesCommentLines."Document Type" := SalesCommentLines."Document Type"::"Posted Invoice";
      SalesCommentLines."No." := pSalesInvHeader."No.";
      SalesCommentLines."Line No." := 1; //Ganz oben in der Bemerkung
      SalesCommentLines.Date := TODAY;
      SalesCommentLines.Comment := STRSUBSTNO('Buchungsdatum ge„ndert! %1 -> %2',pSalesInvHeader."Posting Date",NewPostingDate);
      WHILE NOT SalesCommentLines.INSERT(TRUE) DO
        SalesCommentLines."Line No." += 1;

      WITH pSalesInvHeader DO BEGIN
        IF "Document Date" = "Posting Date" THEN
          "Document Date" := NewPostingDate;
        "Posting Date" := NewPostingDate;
        IF ("Payment Terms Code" <> '') AND ("Document Date" = "Posting Date") THEN BEGIN
          PaymentTerms.GET("Payment Terms Code");
          "Due Date" := CALCDATE(PaymentTerms."Due Date Calculation","Document Date");
          "Pmt. Discount Date" := CALCDATE(PaymentTerms."Discount Date Calculation","Document Date");
        END;
      END;


      WITH GLentry DO BEGIN
        SETCURRENTKEY("Document No.");
        SETRANGE("Document No.",pSalesInvHeader."No.");
        SETRANGE("Posting Date",pSalesInvHeader."Posting Date");
        IF FINDSET THEN REPEAT
          GLentry2 := GLentry;
          GLentry2."Posting Date" := NewPostingDate;
          GLentry2.MODIFY;
        UNTIL NEXT = 0;
      END;

      WITH VATentry DO BEGIN
        SETCURRENTKEY("Document No.");
        SETRANGE("Document No.",pSalesInvHeader."No.");
        SETRANGE("Posting Date",pSalesInvHeader."Posting Date");
        IF FINDSET THEN REPEAT
          VATentry2 := VATentry;
          VATentry2."Posting Date" := NewPostingDate;
          VATentry2.MODIFY;
        UNTIL NEXT = 0;
      END;

      WITH CustLedgEntry DO BEGIN
        SETCURRENTKEY("Document No.");
        SETRANGE("Document No.",pSalesInvHeader."No.");
        SETRANGE("Posting Date",pSalesInvHeader."Posting Date");
        IF FINDSET THEN REPEAT
          CustLedgEntry2 := CustLedgEntry;
          CustLedgEntry2."Posting Date" := NewPostingDate;
          CustLedgEntry2."Document Date" := pSalesInvHeader."Document Date";
          CustLedgEntry2."Due Date" := pSalesInvHeader."Due Date";
          CustLedgEntry2."Pmt. Discount Date" := pSalesInvHeader."Pmt. Discount Date";
          CustLedgEntry2.MODIFY;
        UNTIL NEXT = 0;
      END;

      WITH DetCustLedgEntry DO BEGIN
        SETCURRENTKEY("Document No.");
        SETRANGE("Document No.",pSalesInvHeader."No.");
        SETRANGE("Posting Date",pSalesInvHeader."Posting Date");
        IF FINDSET THEN REPEAT
          DetCustLedgEntry2 := DetCustLedgEntry;
          DetCustLedgEntry2."Posting Date" := NewPostingDate;
          DetCustLedgEntry2.MODIFY;
        UNTIL NEXT = 0;
      END;

      WITH ItemLedgEntry DO BEGIN
        SETCURRENTKEY("Document No.");
        SETRANGE("Document No.",pSalesInvHeader."No.");
        SETRANGE("Posting Date",pSalesInvHeader."Posting Date");
        IF FINDSET THEN REPEAT
          ItemLedgEntry2 := ItemLedgEntry;
          ItemLedgEntry2."Posting Date" := NewPostingDate;
          ItemLedgEntry2.MODIFY;
        UNTIL NEXT = 0;
      END;

      WITH ValueEntry DO BEGIN
        SETCURRENTKEY("Document No.");
        SETRANGE("Document No.",pSalesInvHeader."No.");
        SETRANGE("Posting Date",pSalesInvHeader."Posting Date");
        IF FINDSET THEN REPEAT
          ValueEntry2 := ValueEntry;
          ValueEntry2."Posting Date" := NewPostingDate;
          ValueEntry2.MODIFY;
        UNTIL NEXT = 0;
      END;

      WITH ResLedgEntry DO BEGIN
        SETCURRENTKEY("Document No.");
        SETRANGE("Document No.",pSalesInvHeader."No.");
        SETRANGE("Posting Date",pSalesInvHeader."Posting Date");
        IF FINDSET THEN REPEAT
          ResLedgEntry2 := ResLedgEntry;
          ResLedgEntry2."Posting Date" := NewPostingDate;
          ResLedgEntry2.MODIFY;
        UNTIL NEXT = 0;
      END;

      WITH JobLedgEntry DO BEGIN
        SETCURRENTKEY("Document No.");
        SETRANGE("Document No.",pSalesInvHeader."No.");
        SETRANGE("Posting Date",pSalesInvHeader."Posting Date");
        IF FINDSET THEN REPEAT
          JobLedgEntry2 := JobLedgEntry;
          JobLedgEntry2."Posting Date" := NewPostingDate;
          JobLedgEntry2.MODIFY;
        UNTIL NEXT = 0;
      END;

      pSalesInvHeader.MODIFY;
      SalesInvoiceLine.SETRANGE("Document No.",pSalesInvHeader."No.");
      SalesInvoiceLine.MODIFYALL("Posting Date",pSalesInvHeader."Posting Date");
    END;

    BEGIN
    {
    }
    END.
  }
}

Además, la unidad de código independiente garantiza que sólo pueda delegar toda la función en empleados que trabajen de forma responsable ("Derechos de acceso")