Liquidación Automática de Transacciones con X++ Dynamics AX 2012
Hola a todos, en uno de los últimos proyectos en los que estoy participando, nos ha surgido la necesidad de realizar la creación de Diarios Generales y Diarios de Pagos, así como la creación de Facturas de Servicios directamente desde código X++. El código para realizar esta operación, como ya sabréis, es relativamente sencillo y funciona bastante bien. Pero, en este caso, nos surge una necesidad específica:
Cuando generamos, por ejemplo, un Diario General, sabéis que podemos marcar ciertas transacciones abiertas del cliente para que se liquiden de forma automática con las líneas del diario en cuestión (o contra la Factura de Servicios), de esta forma, vamos cerrando transacciones y disminuyendo el saldo abierto del cliente.
La forma de marcar estas transacciones para su liquidación es muy sencilla. Simplemente tenemos que indicar en la línea del diario la cuenta del cliente, y posteriormente ir a Funciones / Liquidación. Una vez abierto este nuevo formulario, únicamente tenemos que marcar las transacciones que queremos marcar y cerrarlo. Estas transacciones marcadas se liquidarán en el momento de registrar el diario (o factura).
Pues bien, la necesidad que nos surgió era realizar esta misma liquidación de forma automática por medio de programación, de forma que, al crear el diario o factura, estas transacciones se marquen en función de unos filtros realizados, para que, al ejecutar el registro del diario o factura, se vayan machacando las transacciones abiertas del cliente.
El objetivo de este artículo no es otro que compartir este pequeño fragmento de código con la comunidad, así como guardármelo para futuras ocasiones ;). Como ahora veréis, es un código tan sencillo como útil.
// jatomas.com
// t: @juanan169
// Marcar transacciones abiertas de cliente - Código testado en AX 2012 R3 CU10
public void markTransaction(LedgerJouranlTrans _ledgerJournalTrans)
{
CustTransOpen custTransOpen;
CustTrans custTrans;
CustVendOpenTransManager custVendOpenTransManager;
CustAccount custAccount = "Codigo_cliente";
// Seleccionamos la transacción abierta del cliente que queremos liquidar
select custTransOpen
index hint RefRecIdx
where custTransOpen.AccountNum == custAccount
join custTrans
where custTrans.AccountNum == custTransOpen.AccountNum
&& //...
// Marcar transacción
custVendOpenTransManager = CustVendOpenTransManager::construct(_ledgerJournalTrans);
// Si se trata de Factura de servicios
// custVendOpenTransManager = CustVendOpenTransManager::construct(_custInvoiceTable);
custVendOpenTransManager.updateTransMarked(custTransOpen, true);
custVendOpenTransManager.updateSettleAmount(custTransOpen, _ledgerJournalTrans.amount());
// Actualizar linea de diario para indicar que está marcada
// Esta parte de código exclusiva para Diarios
_ledgerJournalTrans.selectForUpdate(true);
_ledgerJournalTrans.SettleVoucher = SettlementType::SelectedTransact;
_ledgerJournalTrans.update();
}Pues hasta aquí el artículo de hoy, espero que os resulte útil.
Saludos!!

Like
Report
*This post is locked for comments