Solicitando ayuda a la comunidad de Dynamics AX trayendo conmigo otro caso.
Estoy trabajando en un desarrollo en el cual al momento de registrar una factura ya sea de orden de venta o factura de servicios, que inserte o añade un asiento más dentro de los asientos contables de entrada de diario general.
Sé muy bien que esto se refiere en hacer un insert a las tablas GeneralJournalEntry y GeneralJournalAccountEntry en AX.
El primer enfoqué que seguí para hacer una implementación que cumpliera con el requisito fue hacer una función que me cree e, inmediatamente, registre un Diario General (encabezado y asiento) enfrentando la cuenta contable configurada, que se le asigna para la transacción, contra la cuenta contable asignada por la factura para el saldo de cliente. Después, esta misma función la agregué para invocarla dentro de las siguientes clases en AX:
CustPostInvoice: mandó a llamar mi función dentro del método 'run' de esa clase.
SalesInvoiceJournalPost: invoco mi función dentro del método 'endUpdate' de esa clase.
La estructura de mi función es muy parecida al siguiente ejemplo que les muestro:
LedgerJournalTable _LedgerJournalTable;
LedgerJournalTrans _LedgerJournalTrans;
LedgerJournalCheckPost _LedgerJournalCheckPost;
NumberSeq _NumberSeq;
ttsbegin;
//----Journal Header
_LedgerJournalTable.JournalName = 'Day1';
_LedgerJournalTable.initFromLedgerJournalName();
_LedgerJournalTable.Name = 'Daily Journal';
_LedgerJournalTable.insert();
//----Journal Line
_NumberSeq =NumberSeq::newGetVoucherFromCode(LedgerJournalName::find(_LedgerJournalTable.JournalName).VoucherSeries);
_LedgerJournalTrans.Voucher =_NumberSeq.voucher();
_LedgerJournalTrans.JournalNum =_LedgerJournalTable.JournalNum;
_LedgerJournalTrans.CurrencyCode =CompanyInfo::standardCurrency();
_LedgerJournalTrans.ExchRate =Currency::exchRate(_LedgerJournalTrans.CurrencyCode);
_LedgerJournalTrans.AccountNum ='110180';
_LedgerJournalTrans.AmountCurDebit =1000;
_LedgerJournalTrans.TransDate =Today();
_LedgerJournalTrans.OffsetAccount ='140270';
_LedgerJournalTrans.Txt ='Arijit Basu :)';
_LedgerJournalTrans.insert();
//----Journal Posting
_LedgerJournalCheckPost =LedgerJournalCheckPost::newLedgerJournalTable(_LedgerJournalTable,NoYes::Yes);
_LedgerJournalCheckPost.run();
ttscommit;
Info(StrFmt("Journal %1 is posted",_LedgerJournalTable.JournalNum));
Hice varias pruebas registrando facturas de ventas y facturas de servicio y obtuve los resultados esperados.
Voy a Contabilidad General \ Consultas \ Rastro de auditoría:
Selecciono el diario que se creó a consecuencia del registro de la factura y me voy a 'Transacciones de asiento' y, efectivamente, veo que el nuevo asiento se agregó al detalle de los asientos contables correspondientes a la factura que los generó.
El asunto es que al registrarse la transacción ésta aparece en un nuevo diario y asientos distintos. Mi duda es ¿si es posible o no que aparezcan en el mismo diario y asiento que generó la factura?
Lo que estoy tratando de hacer para resolver ese problema es que comenté el código de mi función y le agregué otro código que hace uso de las clases LedgerVoucher, LedgerVoucherObject y LedgerVoucherTransObject. Mi nuevo código es parecido al del siguiente ejemplo que les muestro a continuación:
LedgerVoucher _LedgerVoucher;
LedgerVoucherObject _LedgerVoucherObject;
LedgerVoucherTransObject _LedgerVoucherTransObject;
NumberSeq _NumberSeq;
Dimension _Dimension;
NumberSequenceCode _VoucherCode = 'Ledger_3';
LedgerAccount _Account = '110180';
LedgerAccount _OffsetAccount = '140270';
AmountCur _AmountCur = 12345.67;
ttsbegin;
_NumberSeq = NumberSeq::newGetVoucherFromCode(_VoucherCode);
_LedgerVoucher = LedgerVoucher::newLedgerPost(DetailSummary::Detail,
SysModule::Ledger,
_VoucherCode);
_LedgerVoucherObject = LedgerVoucherObject::newVoucher(_NumberSeq.voucher());
_LedgerVoucher.addVoucher(_LedgerVoucherObject);
_LedgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(_LedgerVoucherObject,
LedgerPostingType::LedgerJournal,
_Account,
_Dimension,
CompanyInfo::standardCurrency(),
_AmountCur,
0,
0);
_LedgerVoucherTransObject.parmTransTxt("Arijit Basu");
_LedgerVoucher.addTrans(_LedgerVoucherTransObject);
_LedgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(_LedgerVoucherObject,
LedgerPostingType::LedgerJournal,
_OffsetAccount,
_Dimension,
CompanyInfo::standardCurrency(),
_AmountCur*-1,
0,
0);
_LedgerVoucherTransObject.parmTransTxt("Arijit Basu");
_LedgerVoucher.addTrans(_LedgerVoucherTransObject);
_LedgerVoucher.end();
ttscommit;
Solo que al instanciar la clase LedgerVoucher le envío como parámetro el asiento del histórico de la factura como muestro a continuación.
_LedgerVoucher = LedgerVoucher::newLedgerPost(DetailSummary::Detail,
SysModule::Ledger,
_custInvoiceJour.LedgerVoucher);
Lo que luego me provoca que AX disparé un error cuando trato de registrar la factura desplegando en pantalla que, "el número del asiento ya se usó previamente".
Habiendo fracasado en este enfoque, entonces, ¿cómo puedo hacer que el asiento me aparezca dentro del mismo diario y asiento que generó la factura al registrarla?, o ¿No es posible hacer eso en AX a menos que tuviera que modificar las clases estándar para LedgerVoucher?
Adjuntos:
343-AsientoContable.jpg