- Changing legislation leads to many different depreciation rates depending on the time an asset was acquired.
- Dynamics Ax requires one value model per depreciation rate, i.e. we need around 30 value models.
- Each value model requires a specific posting profile. Each posting profile has at least 14 entries. Leading to over 400(!) entries.
- Every new Asset requires the setting up of a new posting profile (if the depreciation rate is again different).
Solution:
- Allow the system to fall back to a default posting profile attached to the value model "Std".
- Make the modification that still allow multiple posting profiles if needed, i.e. first try to use standard functionality, only if failed fall back to a default posting profile.
- The following methods must be modified:
- Table AssetLedgerAccounts
- find
- findAssetLedgerAccount
- findAssetLedgerOffsetAccount
- assetLedgerAccount
- assetLedgerOffsetAccount
- exist
- Table AssetLedgerAccounts
- Class AssetReclassification
- findNewAssetLedgerAccount
- findOldAssetLedgerAccount
- Table AssetDisposalParameters
- find
- findPosintingAccound
- exist
- Class AssetPostDisposal
- post
General pseudo code structure:
found = select1 where BookId == _bookid;
if (!found)
found = select2 where BookId == _bookid;
//new:
if (!found)
found = select1 where BookId == "Std";
if (!found)
res = select2 where BookId == "Std;
public static boolean exist( //table AssetLedgerAccounts
AssetBookId _bookId,
AssetPostingProfile _postingProfile,
AssetTransType _transType,
AssetTableGroupAll _accountCode,
AccountNum _accountRelation)
{
boolean found;
;
found = (select firstonly
RecId
from
assetLedgerAccounts
where
assetLedgerAccounts.BookId == _bookId &&
assetLedgerAccounts.PostingProfile == _postingProfile &&
assetLedgerAccounts.TransType == _transType &&
assetLedgerAccounts.AccountCode == _accountCode &&
assetLedgerAccounts.AccountRelation == _accountRelation).RecId != 0;
//bw start
//Changed on 21 May 2007 by TW
/* Description:
Default to the Value Model "Std" if no specific BookId found.
*/
if (!found)
{
found = (select firstonly
RecId
from
assetLedgerAccounts
where
assetLedgerAccounts.BookId == "Std" &&
assetLedgerAccounts.PostingProfile == _postingProfile &&
assetLedgerAccounts.TransType == _transType &&
assetLedgerAccounts.AccountCode == _accountCode &&
assetLedgerAccounts.AccountRelation == _accountRelation).RecId != 0;
}
//bw end
return found;
}
- AssetPostDisposal is the only exception to this simple pattern. As there is a while select loop, the situation needs to be handled slightly different
void post() //class AssetPostDisposal
{
AssetAmount assetAmount;
AssetDisposalParameters assetDisposalParameters;
AssetDisposalParameters l_assetDisposalParameters;
AssetPostType assetPostType;
AssetSoldScrap soldScrap;
CurrencyCode companyCurrency = CompanyInfo::standardCurrency();
LedgerVoucherTransObject ledgerVoucherTransObject;
boolean useStd = false; //bw
;
ttsbegin;
[…]
select assetDisposalParameters
where assetDisposalParameters.PostValue == AssetPostValue::NBV &&
assetDisposalParameters.SoldScrap == soldScrap &&
assetDisposalParameters.PostingProfile == assetTrans.PostingProfile &&
assetDisposalParameters.BookId == assetTrans.BookId &&
(assetDisposalParameters.ValueType == assetPostType ||
assetDisposalParameters.ValueType == AssetPostType::All) &&
((assetDisposalParameters.AssetCode == TableGroupAll::Table &&
assetDisposalParameters.AssetRelation == assetTrans.AssetId) ||
(assetDisposalParameters.AssetCode == TableGroupAll::GroupId &&
assetDisposalParameters.AssetRelation == AssetTable::find(assetTrans.AssetId).AssetGroup) ||
assetDisposalParameters.AssetCode == TableGroupAll::All);
//bw start
//Changed on 21 May 2007 by TW
/* Description:
Default to the Value Model "Std" if no specific BookId found.
*/
if (!assetDisposalParameters)
{
useStd = true;
select assetDisposalParameters
where assetDisposalParameters.PostValue == AssetPostValue::NBV &&
assetDisposalParameters.SoldScrap == soldScrap &&
assetDisposalParameters.PostingProfile == assetTrans.PostingProfile &&
assetDisposalParameters.BookId == "Std" &&
(assetDisposalParameters.ValueType == assetPostType ||
assetDisposalParameters.ValueType == AssetPostType::All) &&
((assetDisposalParameters.AssetCode == TableGroupAll::Table &&
assetDisposalParameters.AssetRelation == assetTrans.AssetId) ||
(assetDisposalParameters.AssetCode == TableGroupAll::GroupId &&
assetDisposalParameters.AssetRelation == AssetTable::find(assetTrans.AssetId).AssetGroup) ||
assetDisposalParameters.AssetCode == TableGroupAll::All);
}
//bw end
if (!assetDisposalParameters.RecId)
{
throw error(strfmt("@SYS24602","@SYS67345" + ‘/’ + "@SYS67538", "@SYS67500"));
}
while select assetDisposalParameters
group by PostValue
where assetDisposalParameters.SoldScrap == soldScrap &&
assetDisposalParameters.PostingProfile == assetTrans.PostingProfile &&
//bw start
//Changed on 21 May 2007 by TW
/* Description:
if mod was needed above use Std else use BookId
*/
assetDisposalParameters.BookId == (useStd?"Std":assetTrans.BookId) &&
//bw end
(assetDisposalParameters.ValueType == assetPostType ||
assetDisposalParameters.ValueType == AssetPostType::All)
{
l_assetDisposalParameters = AssetDisposalParameters::findPostingAccount(assetTrans.AssetId,
assetDisposalParameters.SoldScrap,
assetDisposalParameters.PostingProfile,
assetDisposalParameters.BookId,
assetDisposalParameters.ValueType,
assetDisposalParameters.PostValue);
assetAmount = this.postValue(l_assetDisposalParameters.PostValue);
if (assetAmount)
{
ledgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(
ledgerVoucher.findLedgerVoucherObject(),
LedgerPostingType::FixedAssetsDebit,
l_assetDisposalParameters.Account,
assetTrans.Dimension,
companyCurrency, //assetTrans.currencyCode,
-assetAmount,
assetTrans.TableId,
assetTrans.RecId,
0);
ledgerVoucherTransObject.parmOperationsTax(LedgerVoucher::operationsTax(AssetBookTable::find(assetTrans.BookId).CurrentOperationsTax));
ledgerVoucherTransObject.parmTransTxt(assetTrans.Txt);
ledgerVoucher.addTrans(ledgerVoucherTransObject);
ledgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(
ledgerVoucher.findLedgerVoucherObject(),
LedgerPostingType::FixedAssetsDebit,
l_assetDisposalParameters.OffsetAccount,
assetTrans.Dimension,
companyCurrency, //assetTrans.currencyCode,
assetAmount,
assetTrans.TableId,
assetTrans.RecId,
0);
ledgerVoucherTransObject.parmOperationsTax(LedgerVoucher::operationsTax(AssetBookTable::find(assetTrans.BookId).CurrentOperationsTax));
ledgerVoucherTransObject.parmTransTxt(assetTrans.Txt);
ledgerVoucher.addTrans(ledgerVoucherTransObject);
}
}
ttscommit;
}

Leave a Reply