En Dynamics Ax, todas las transacciones financieras sin importar en dónde sean generadas terminan en el módulo de General ledger (libro mayor). Cualquier modificación personalizada que se requiera en este módulo, los desarrolladores debemos usar las APIs de Ax para crearlas, de otra forma, si las creamos directamente en las tablas es muuuuy probable que afectemos la exactitud de los datos financieros.
Entonces, para asegurarnos de mantener la coherencia entre datos debemos usar estas APIs. Uno de ellos es el proceso de ledgervoucher, que en español es como un identificador de la transacción. Esto nos permite "postear" o registrar un voucher financiero en el libro de mayor.
Los vouchers en Dynamics Ax son las entradas de balance financiero representadas en una sola operación. Estos voucher incluyen 2 o mas transacciones del ledger. La API de LedgerVoucher se asegura que todos los criterios requeridos como números de vouchers, periodos financieros, cuentas ledger, dimensiones financieras, saldos y otros, son válidos.
Aquí voy a poner cómo podemos crear y postear un ledger voucher desde código. Voy a crear un único voucher con dos transacciones (operaciones).
private container postTransToLedger()
{
Voucher voucher;
RefRecId generalJournalEntryRecid;
LedgerVoucher voucherPaym;
LedgerVoucherObject voucherObject;
LedgerVoucherTransObject voucherTransObject;
Ledger ledger = Ledger::findByLegalEntity(CompanyInfo::find().RecId);
GRWModoPagoCaja modoPago = GRWModoPagoCaja::find(this.ModoPagoId);
NumberSeq numberSeq;
;
numberSeq = numberSeq::newGetNum(GRWCajaParameters::CajaVoucherTrans());
voucher = numberSeq.num();
voucherPaym = LedgerVoucher::newLedgerPost( DetailSummary::Detail,
SysModule::Ledger,
GRWCajaParameters::CajaVoucherTrans().numberSequenceTable().NumberSequence);
voucherObject = LedgerVoucherObject::newVoucher( voucher,
this.TransDate,
SysModule::Ledger,
LedgerTransType::None,
false,
OperationsTax::Current);
voucherPaym.addVoucher(voucherObject);
voucherTransObject = LedgerVoucherTransObject::newBasicDefault( voucherObject,
LedgerPostingType::LedgerJournal,
DimensionDefaultingService::serviceCreateLedgerDimension(modoPago.CuentaPuente), // Cuenta de cuenta puente
this.Currencycode,
this.AmountCur,
this.AmountMST,
Currency::curAmount2CurAmount(this.AmountMST, ledger.AccountingCurrency, ledger.ReportingCurrency));
voucherTransObject.parmTransTxt(strfmt("Transacción de caja Manual Puenteo %1", this.ModoPagoId));
voucherObject.addTrans(voucherTransObject);
voucherTransObject = LedgerVoucherTransObject::newBasicDefault( voucherObject,
LedgerPostingType::LedgerJournal,
DimensionDefaultingService::serviceCreateLedgerDimension(modoPago.CuentaCaja), // Cuenta caja
this.Currencycode,
-this.AmountCur,
-this.AmountMST,
-Currency::curAmount2CurAmount(this.AmountMST, ledger.AccountingCurrency, ledger.ReportingCurrency));
voucherTransObject.parmTransTxt(strfmt("Transacción de caja Manual Concentración %1", this.ModoPagoId));
voucherObject.addTrans(voucherTransObject);
voucherPaym.end();
return [voucher, generalJournalEntryRecid];
}
{
Voucher voucher;
RefRecId generalJournalEntryRecid;
LedgerVoucher voucherPaym;
LedgerVoucherObject voucherObject;
LedgerVoucherTransObject voucherTransObject;
Ledger ledger = Ledger::findByLegalEntity(CompanyInfo::find().RecId);
GRWModoPagoCaja modoPago = GRWModoPagoCaja::find(this.ModoPagoId);
NumberSeq numberSeq;
;
numberSeq = numberSeq::newGetNum(GRWCajaParameters::CajaVoucherTrans());
voucher = numberSeq.num();
voucherPaym = LedgerVoucher::newLedgerPost( DetailSummary::Detail,
SysModule::Ledger,
GRWCajaParameters::CajaVoucherTrans().numberSequenceTable().NumberSequence);
voucherObject = LedgerVoucherObject::newVoucher( voucher,
this.TransDate,
SysModule::Ledger,
LedgerTransType::None,
false,
OperationsTax::Current);
voucherPaym.addVoucher(voucherObject);
voucherTransObject = LedgerVoucherTransObject::newBasicDefault( voucherObject,
LedgerPostingType::LedgerJournal,
DimensionDefaultingService::serviceCreateLedgerDimension(modoPago.CuentaPuente), // Cuenta de cuenta puente
this.Currencycode,
this.AmountCur,
this.AmountMST,
Currency::curAmount2CurAmount(this.AmountMST, ledger.AccountingCurrency, ledger.ReportingCurrency));
voucherTransObject.parmTransTxt(strfmt("Transacción de caja Manual Puenteo %1", this.ModoPagoId));
voucherObject.addTrans(voucherTransObject);
voucherTransObject = LedgerVoucherTransObject::newBasicDefault( voucherObject,
LedgerPostingType::LedgerJournal,
DimensionDefaultingService::serviceCreateLedgerDimension(modoPago.CuentaCaja), // Cuenta caja
this.Currencycode,
-this.AmountCur,
-this.AmountMST,
-Currency::curAmount2CurAmount(this.AmountMST, ledger.AccountingCurrency, ledger.ReportingCurrency));
voucherTransObject.parmTransTxt(strfmt("Transacción de caja Manual Concentración %1", this.ModoPagoId));
voucherObject.addTrans(voucherTransObject);
voucherPaym.end();
return [voucher, generalJournalEntryRecid];
}
No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrolladores de Ax en nuestro idioma.
Este comentario ha sido eliminado por el autor.
ResponderBorrarEn ningún momento llenás generalJournalEntryRecid...
ResponderBorrarBuenas noches Yered, me podrías dar una mano por fa!!!! Necesito generar asientos de unas facturas que se generan a partir de ordenes de venta, esta lógica que publicaste me podria servir? si la respuesta es si, donde deberia insertar este codigo?. Estoy intentando insertar este codigo dentro mi logica donde hago la facturacion (osea en el insert de las facturas) pero se me complica porque trabajo con el 365 y no tengo todas las clases que tu usas. Esta excelente tu blog,, mucho me sirvió ya,! espero que puedas darme una mano! Saludos. mi correo es die407@gmail.com
ResponderBorrar