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

Introducción/Explicación/Rechazo de responsabilidad: Hay muy buenas razones por las que las contabilizaciones en Navision y Business Central y en la mayoría de los programas de contabilidad como Datev y Diamand y HS no pueden modificarse a posteriori. El más importante es, por ejemplo, el GoB, principios de contabilidad adecuada. Estos también están fijados por ley. Esta solución aquí para la corrección posterior de una fecha de contabilización se refiere, por ejemplo, al art. 146, apdo. 4 AO y al art. 239, apdo. 3. Según estas normativas, cuando se modifican los registros, el contenido original del registro debe ser determinable. Si hay que realizar cambios, hay que asegurarse de que estén claramente marcados para que sea evidente 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")