Description
Transfers an intangible asset.
Formula
SET CREATENONMISSINGBLK ON; SET UPDATECALC OFF; SET AGGMISSG ON; VAR periodOffset = 0; VAR amortMethod = 0; VAR numAmortPeriods = 0; VAR priorAccumAmort = 0; VAR basicCost = 0; VAR salvageVal = 0; VAR amortAmt = 0; VAR retirementCosts = 0; VAR retirementObs = 0; VAR impairmentDate1 = 0; VAR impairmentDate2 = 0; VAR impairmentFairVal1 = 0; VAR impairmentFairVal2 = 0; VAR inServiceDate = 0; VAR delayedStartDate = 0; VAR prematureEndDate = 0; VAR maintenanceCost = 0; VAR insuranceCost = 0; VAR cashOutflowDate = 0; VAR fundingDate = 0; VAR purchaseDate = 0; VAR cashFlowIncidence = 0; VAR fundingIncidence = 0; VAR cashStaggeredPers = 1; VAR fundingStaggeredPers = 1; VAR cashAllocPct = 1; VAR fundingAllocPct = 1; VAR fundingAmt = 0; VAR setCashImpact = 0; VAR setFundingImpact = 0; VAR capitalizePct = 0; VAR impairmentOpt = 1; VAR numRemainingPers; VAR intangibleNet; VAR netValue; VAR saleValue; VAR yearVal; VAR monthVal; VAR xferAsset = 0; VAR paramsSet = 0; VAR cashflowChanged = 0; VAR fundingChanged = 0; VAR preExistingPers = 0; VAR setStartAmort = 0; /* Transfer section: Locate either an asset with same Asset ID or a new one for transfer */ FIX(@CHILDREN("Total New"), [Hidden_Scenario], [Hidden_Version], [DepartmentTo], [AssetClassInt], "No Year", "BegBalance") "Asset Description" ( IF (NOT @ISMBR([DepartmentFrom])) IF ((@MAXS(SKIPMISSING, @CHILDREN("Asset Properties")) == #MISSING) OR ("Asset ID" == [DepartmentFrom]->[SrcLineItem]->"Asset ID" AND [DepartmentFrom]->[SrcLineItem]->"Asset ID" <> #MISSING)) IF ("Asset ID" == [DepartmentFrom]->[SrcLineItem]->"Asset ID" AND [DepartmentFrom]->[SrcLineItem]->"Asset ID" <> #MISSING) /* Clear out any duplicate Assets based on Asset ID if already transferred */ IF (xferAsset == 1) "Asset Status" = -1; /* mark line item for deletion */ ELSE xferAsset = 1; "Asset Status" = 0; "Asset ID" = [DepartmentFrom]->[SrcLineItem]->"Asset ID"; "Asset Description" = [DepartmentFrom]->[SrcLineItem]->"Asset Description"; "CAR No." = [DepartmentFrom]->[SrcLineItem]->"CAR No."; "Justification" = [DepartmentFrom]->[SrcLineItem]->"Justification"; "Physical Location" = [DepartmentFrom]->[SrcLineItem]->"Physical Location"; "UOM" = [DepartmentFrom]->[SrcLineItem]->"UOM"; "Priority" = [DepartmentFrom]->[SrcLineItem]->"Priority"; "Asset Units" = [DepartmentFrom]->[SrcLineItem]->"Asset Units"; "Asset Rate" = [DepartmentFrom]->[SrcLineItem]->"Asset Rate"; "Installation" = [DepartmentFrom]->[SrcLineItem]->"Installation"; "Freight" = [DepartmentFrom]->[SrcLineItem]->"Freight"; "Salvage Input" = [DepartmentFrom]->[SrcLineItem]->"Salvage Input"; "Taxes %" = [DepartmentFrom]->[SrcLineItem]->"Taxes %"; "Acquisition Costs" = [DepartmentFrom]->[SrcLineItem]->"Acquisition Costs"; "Additional Charges" = [DepartmentFrom]->[SrcLineItem]->"Additional Charges"; "Retirement Obligation" = [DepartmentFrom]->[SrcLineItem]->"Retirement Obligation"; "Retirement Options" = [DepartmentFrom]->[SrcLineItem]->"Retirement Options"; "Partial Capitalize %" =[DepartmentFrom]->[SrcLineItem]->"Partial Capitalize %"; "Basic Cost" = "Acquisition Costs" + "Additional Charges"; "Useful Life (in Years)" = "No Scenario"->"No Version"->"No Entity"->"Global"->"Useful Life (in Years)"; "Salvage" = "Salvage Input" * "Asset Units"; "Cash Flow Incidence" = "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Cash Flow Incidence"; "Funding Incidence" = "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Funding Incidence"; "Purchase Date" = [DepartmentFrom]->[SrcLineItem]->"Purchase Date"; "In Service Date" = [DepartmentFrom]->[SrcLineItem]->"In Service Date"; IF ("In Service Date" < "Purchase Date") "In Service Date" = "Purchase Date"; ENDIF "Delayed Start Date" = [TransferDate]; "Reason Delayed" = 1; ENDIF ELSEIF (xferAsset == 0 AND @MAXS(SKIPMISSING, @CHILDREN("Asset Properties")) == #MISSING) xferAsset = 1; "Asset Status" = 0; "Asset ID" = [DepartmentFrom]->[SrcLineItem]->"Asset ID"; "Asset Description" = [DepartmentFrom]->[SrcLineItem]->"Asset Description"; "CAR No." = [DepartmentFrom]->[SrcLineItem]->"CAR No."; "Justification" = [DepartmentFrom]->[SrcLineItem]->"Justification"; "Physical Location" = [DepartmentFrom]->[SrcLineItem]->"Physical Location"; "UOM" = [DepartmentFrom]->[SrcLineItem]->"UOM"; "Priority" = [DepartmentFrom]->[SrcLineItem]->"Priority"; "Asset Units" = [DepartmentFrom]->[SrcLineItem]->"Asset Units"; "Asset Rate" = [DepartmentFrom]->[SrcLineItem]->"Asset Rate"; "Installation" = [DepartmentFrom]->[SrcLineItem]->"Installation"; "Freight" = [DepartmentFrom]->[SrcLineItem]->"Freight"; "Salvage Input" = [DepartmentFrom]->[SrcLineItem]->"Salvage Input"; "Taxes %" = [DepartmentFrom]->[SrcLineItem]->"Taxes %"; "Acquisition Costs" = [DepartmentFrom]->[SrcLineItem]->"Acquisition Costs"; "Additional Charges" = [DepartmentFrom]->[SrcLineItem]->"Additional Charges"; "Retirement Obligation" = [DepartmentFrom]->[SrcLineItem]->"Retirement Obligation"; "Retirement Options" = [DepartmentFrom]->[SrcLineItem]->"Retirement Options"; "Partial Capitalize %" =[DepartmentFrom]->[SrcLineItem]->"Partial Capitalize %"; "Basic Cost" = "Acquisition Costs" + "Additional Charges"; "Useful Life (in Years)" = "No Scenario"->"No Version"->"No Entity"->"Global"->"Useful Life (in Years)"; "Salvage" = "Salvage Input" * "Asset Units"; "Cash Flow Incidence" = "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Cash Flow Incidence"; "Funding Incidence" = "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Funding Incidence"; "Purchase Date" = [DepartmentFrom]->[SrcLineItem]->"Purchase Date"; "In Service Date" = [DepartmentFrom]->[SrcLineItem]->"In Service Date"; IF ("In Service Date" < "Purchase Date") "In Service Date" = "Purchase Date"; ENDIF "Delayed Start Date" = [TransferDate]; "Reason Delayed" = 1; ENDIF ENDIF ENDIF ); ENDFIX FIX([Hidden_Scenario], [Hidden_Version], [DepartmentFrom], [AssetClassInt], [SrcLineItem], "No Year", "BegBalance") "Premature End Date" ( IF (xferAsset == 1) "Asset Status" = 0; /* set status to new to trigger recalc below */ "Premature End Date" = [TransferDate]; "Reason Ended" = 1; "Sale Value" = #MISSING; ENDIF ); ENDFIX /* Calculate amortization after transfer */ FIX(@DESCENDANTS("Total New"), [Hidden_Scenario], [Hidden_Version], [DepartmentFrom], [DepartmentTo], [AssetClassInt]) FIX (@LEVMBRS("Period", 0) @LEVMBRS("Year", 0)) "Amortization"( /* Only calc valid asset line items */ IF ("No Year"->"BegBalance"->"Asset Status" >= 0) IF (@ISMBR("BegBalance") AND paramsSet == 0) /* Initialized all the variables required to calculate depreciation */ paramsSet = 1; /* eliminate days from date */ delayedStartDate = @INT("No Year"->"Delayed Start Date" / 100) * 100; prematureEndDate = @INT("No Year"->"Premature End Date" / 100) * 100; purchaseDate = @INT("No Year"->"Purchase Date" / 100) * 100; inServiceDate = @INT("No Year"->"In Service Date" / 100) * 100; cashOutflowDate = purchaseDate; fundingDate = purchaseDate; cashFlowIncidence = "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Cash Flow Incidence"; IF (cashFlowIncidence <> "No Year"->"Cash Flow Incidence") cashflowChanged = 1; ELSE cashflowChanged = 0; ENDIF IF (cashFlowIncidence == -1 AND cashflowChanged == 1) cashStaggeredPers = 4; ELSE /* Extract year and month from date to adjust based in incidence values in global assumptions */ yearVal = @INT(cashOutflowDate / 10000) * 10000; monthVal = cashOutflowDate - yearVal; monthVal = monthVal + cashFlowIncidence; IF (monthVal <= 0) yearVal = yearVal - 10000; monthVal = 1200 + monthVal; ELSEIF (monthVal > 1200) yearVal = yearVal + 10000; monthVal = monthVal - 1200; ENDIF cashOutflowDate = yearVal + monthVal; cashStaggeredPers = 1; ENDIF fundingIncidence = "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Funding Incidence"; IF (fundingIncidence <> "No Year"->"Funding Incidence") fundingChanged = 1; ELSE fundingChanged = 0; ENDIF IF (fundingIncidence == -1 AND fundingChanged == 1) fundingStaggeredPers = 4; ELSE yearVal = @INT(fundingDate / 10000) * 10000; monthVal = fundingDate - yearVal; monthVal = monthVal + fundingIncidence; IF (monthVal <= 0) yearVal = yearVal - 10000; monthVal = 1200 + monthVal; ELSEIF (monthVal > 1200) yearVal = yearVal + 10000; monthVal = monthVal - 1200; ENDIF fundingDate = yearVal + monthVal; fundingStaggeredPers = 1; ENDIF /* Initialize for amortization calc in next section */ basicCost = "No Year"->"Basic Cost"; salvageVal = "No Year"->"Salvage Input" * "No Year"->"Asset Units"; impairmentOpt = "No Year"->"Impairment Option"; capitalizePct = "No Year"->"Partial Capitalize %"; saleValue = "No Year"->"Sale Value"; retirementCosts = "No Year"->"Retirement Costs"; retirementObs = "No Year"->"Retirement Obligation"; amortMethod = "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Amortization Method"; insuranceCost = basicCost * "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Insurance %"; maintenanceCost = basicCost * "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Maintenance %"; fundingAmt = basicCost * "No Year"->"No Scenario"->"No Version"->"No Entity"->"Global"->"Funding %"; IF ("No Year"->"Impairment Date1" <> #MISSING) impairmentDate1 = @INT("No Year"->"Impairment Date1" / 100) * 100; ELSE impairmentDate1 = #MISSING; ENDIF IF ("No Year"->"Impairment Date2" <> #MISSING) impairmentDate2 = @INT("No Year"->"Impairment Date2" / 100) * 100; ELSE impairmentDate2 = #MISSING; ENDIF impairmentFairVal1 = "No Year"->"Impairment Fair Value1"; impairmentFairVal2 = "No Year"->"Impairment Fair Value2"; /* check if we have a pre-existing asset */ IF (inServiceDate < "First Date") yearVal = (@INT("First Date" / 10000) * 10000 - @INT(inServiceDate / 10000) * 10000) / 10000; monthVal = ("First Date" - @INT("First Date" / 10000) * 10000) - (inServiceDate - @INT(inServiceDate / 10000) * 10000); IF (monthVal < 0) IF (yearVal > 0) yearVal = yearVal - 1; ENDIF monthVal = 1200 + monthVal; ENDIF preExistingPers = @ROUND(yearVal * 12 + monthVal / 100, 0); setStartAmort = 1; ELSE preExistingPers = 0; setStartAmort = 0; ENDIF numAmortPeriods = 0; periodOffset = 0; IF (amortMethod == 1) priorAccumAmort = 0; amortAmt = 0; setCashImpact = 0; setFundingImpact = 0; yearVal = @INT(inServiceDate / 10000) * 10000; monthVal = (inServiceDate - @INT(inServiceDate / 10000) * 10000); ENDIF ENDIF IF (@ISMBR("No Year") AND @ISMBR("BegBalance")) paramsSet = 0; IF ("Asset Status" == 0) "Asset Status" = 1; ENDIF ENDIF IF (NOT @ISMBR("BegBalance") AND paramsSet == 1) /* clear out any previously calculated values */ "Amortization" = #MISSING; "Accumulated Amortization" = #MISSING; "Intangible Assets Finite, Gross" = #MISSING; "Loss/(Gain) on Sale of Intangibles" = #MISSING; "Proceeds from Sale of Intangibles" = #MISSING; IF (cashFlowIncidence <> -1 OR cashflowChanged == 1) "Cash Flow Allocator" = #MISSING; ENDIF IF (fundingIncidence <> -1 OR fundingChanged == 1) "Funding Allocator" = #MISSING; ENDIF "Cash Outflow from Capital Additions" = #MISSING; "Cash Inflow from Funding" = #MISSING; "Long Term Debt" = #MISSING; "Insurance" = #MISSING; "Maintenance" = #MISSING; "Impairment of Assets" = #MISSING; "Capital Reserve" = #MISSING; "Capital Expenditure" = #MISSING; "Retirement Expenses" = #MISSING; IF ("TP-Date" == purchaseDate AND (delayedStartDate == #MISSING OR (delayedStartDate > #MISSING AND "TP-Date" > delayedStartDate))) "Capital Expenditure" = basicCost - retirementObs; ENDIF IF ("TP-Date" == cashOutflowDate AND (delayedStartDate == #MISSING OR (delayedStartDate > #MISSING AND "TP-Date" > delayedStartDate))) setCashImpact = cashStaggeredPers; cashAllocPct = 1 / cashStaggeredPers; ENDIF IF ("TP-Date" == fundingDate AND (delayedStartDate == #MISSING OR (delayedStartDate > #MISSING AND "TP-Date" > delayedStartDate))) setFundingImpact = fundingStaggeredPers; fundingAllocPct = 1 / fundingStaggeredPers; ENDIF IF (setCashImpact > 0) "Cash Flow Allocator" = cashAllocPct; setCashImpact = setCashImpact - 1; ENDIF "Cash Outflow from Capital Additions" = basicCost * "Cash Flow Allocator"; IF (setFundingImpact > 0) "Funding Allocator" = fundingAllocPct; setFundingImpact = setFundingImpact - 1; ENDIF "Cash Inflow from Funding" = fundingAmt * "Funding Allocator"; "Long Term Debt" = fundingAmt * "Funding Allocator"; /* Check if we should start amortization */ IF (("TP-Date" == inServiceDate) OR (setStartAmort == 1)) setStartAmort = 0; periodOffset = 0; numAmortPeriods = "NumPeriods" * "No Year"->"BegBalance"->"Useful Life (in Years)"; insuranceCost = insuranceCost / "NumPeriods"; maintenanceCost = maintenanceCost / "NumPeriods"; intangibleNet = basicCost; amortAmt = (basicCost - salvageVal) / numAmortPeriods; /* Adjust for pre existing assets */ IF (preExistingPers > 0) numAmortPeriods = numAmortPeriods - preExistingPers; IF (numAmortPeriods > 0) priorAccumAmort = amortAmt * preExistingPers; ENDIF ENDIF numRemainingPers = numAmortPeriods; ENDIF /* Amortization calculation section */ IF (amortMethod == 1 AND periodOffset < numAmortPeriods) /* If capitalized book in Capital Reserve instead of Impairment */ IF ("TP-Date" == impairmentDate1) IF (impairmentOpt == 1) "Impairment of Assets" = intangibleNet - impairmentFairVal1; ELSEIF (impairmentOpt == 2) "Capital Reserve" = intangibleNet - impairmentFairVal1; ELSEIF (impairmentOpt == 3) "Capital Reserve" = (intangibleNet - impairmentFairVal1) * capitalizePct; "Impairment of Assets" = intangibleNet - impairmentFairVal1 - "Capital Reserve"; ENDIF basicCost = basicCost - (intangibleNet - impairmentFairVal1); amortAmt = impairmentFairVal1 / numRemainingPers; ELSEIF ("TP-Date" == impairmentDate2) IF (impairmentOpt == 1) "Impairment of Assets" = intangibleNet - impairmentFairVal2; ELSEIF (impairmentOpt == 2) "Capital Reserve" = intangibleNet - impairmentFairVal2; ELSEIF (impairmentOpt == 3) "Capital Reserve" = (intangibleNet - impairmentFairVal2) * capitalizePct; "Impairment of Assets" = intangibleNet - impairmentFairVal2 - "Capital Reserve"; ENDIF basicCost = basicCost - (intangibleNet - impairmentFairVal2); amortAmt = impairmentFairVal2 / numRemainingPers; ENDIF IF (periodOffset + 1 == numAmortPeriods) amortAmt = (basicCost - salvageVal) - priorAccumAmort; ENDIF priorAccumAmort = priorAccumAmort + amortAmt; intangibleNet = basicCost - priorAccumAmort; /* Only assign values to member if we are in range */ IF ("TP-Date" >= delayedStartDate AND ("TP-Date" >= inServiceDate OR preExistingPers > 0) AND (prematureEndDate == #MISSING OR "TP-Date" < prematureEndDate)) "Intangible Assets Finite, Gross" = basicCost; "Amortization" = amortAmt; "Accumulated Amortization" = priorAccumAmort; "Insurance" = insuranceCost; "Maintenance" = maintenanceCost; ENDIF /* Set the loss/gain if we had a sale or writeoff */ IF ("TP-Date" == prematureEndDate) IF ("No Year"->"BegBalance"->"Reason Ended" == 2 OR "No Year"->"BegBalance"->"Reason Ended" == 3) netValue = basicCost - priorAccumAmort + retirementCosts; IF ("No Year"->"BegBalance"->"Reason Ended" == 3) "Loss/(Gain) on Sale of Intangibles" = netValue - saleValue + amortAmt; ELSE "Loss/(Gain) on Sale of Intangibles" = netValue + amortAmt; ENDIF "Retirement Expenses" = retirementCosts - retirementObs; "Proceeds from Sale of Intangibles" = saleValue - retirementCosts; ENDIF ENDIF periodOffset = periodOffset +1; numRemainingPers = numRemainingPers -1; ENDIF ENDIF ENDIF ); ENDFIX FIX ("BegBalance", "No Year") "Cash Flow Incidence" ( IF (cashflowChanged == 1 AND "Asset Status" > 0) "Cash Flow Incidence" = cashFlowIncidence; ENDIF IF (fundingChanged == 1 AND "Asset Status" > 0) "Funding Incidence" = fundingIncidence; ENDIF ) ENDFIX ENDFIX /* Clear out any asset line items marked for delete */ FIX(@CHILDREN("Total New"), [Hidden_Version], [DepartmentTo], [AssetClassInt]) [Hidden_Scenario]( IF ("No Year"->"BegBalance"->"Asset Status" == -1) @CURRMBR("Line Item") = #MISSING; ENDIF ); ENDFIX FIX([Hidden_Scenario], [Hidden_Version], [DepartmentFrom], [DepartmentTo]) CALC DIM ("Period"); @ANCESTORS([SrcLineItem]); @ANCESTORS([AssetClassInt]); ENDFIX