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")