Oracle-NetSuite-Fixed-Asset-Management.md

Oracle-NetSuite-Fixed-Asset-Management.md

Process description

Fixed Asset Management process

The Fixed Asset Management Process is about the process of proposing an Asset, then creating this Asset and following its use, depreciation, location transfers, revaluations, impairments/repairs, through to its eventual disposal. More information on the fixed asset management process in NetSuite can be found in this FAM handbook .

Available tags & due dates

The following tags are available by default.

TagDescription
Current NBV higher than previous year NBVAssets."Current_net_book_value" > Assets."Prior_year_nbv"
Asset creation time more than 30 days{{ pm_utils.datediff('day', 'asset_proposal_to_asset_event_ends."Proposal_event_end"', 'asset_proposal_to_asset_event_ends."Creation_event_end"') }} > 30
Asset does not have asset proposalAsset_proposals."custrecord_propasset" is null
Write down account different to write off accountAssets."Write_down_account" != Assets."Write_off_account"
Fully depreciated asset still in useAssets."Asset_status" = 'Fully depreciated'

The following due dates are available by default.

Due DateDescription
Last Depreciation Date Different to Depreciation End DateLast depreciation date occurs on a different date to the depreciation end date that is specified

This app template uses Netsuite version 2021.2 or higher as source system. NetSuite has two data model configurations: SuiteTalk and SuiteQL. Both SuiteTalk and SuiteQL schemas are used in this app template.

Extraction for the system is done using CData Sync. To set-up the extraction, make sure you have a valid license for CData Sync and have installed CData Sync.

System configuration

To be able to connect to Netsuite, certain features need to be enabled in Netsuite and a role should be created with the correct access.

Features and user role

In NetSuite, go to Setup -> Company -> Enable Features and enable the following in the SuiteCloud tab:

  • CLIENT SUITESCRIPT
  • SERVER SUITESCRIPT
  • SUITESCRIPT SERVER PAGES
  • SOAP WEB SERVICES
  • REST WEB SERVICES
  • TOKEN-BASED AUTHENTICATION
  • OAUTH 2.0

A role should be created for connecting to NetSuite to extract the data. This role must have the permissions that are listed in CData's documentation for their NetSuite connector. Use a naming convention for the role that would be memorable, like CData Extractor. Create a token for this role to use in the extraction and note down the details.

NetSuite and CData Sync Date Matching

In order for filtering on dates to work, the date format in NetSuite should be used in the extraction configuration. Go to NetSuite -> SetUp -> Company -> General Preferences and make note of the date format (MM/DD/YYYY for instance). When configuring the data extraction job in CData, the dates in the date extraction range need to be specified in the same format.

Setting up the source connection in CData Sync

To be able to extract data from NetSuite, two source connections need to be created in CData Sync, one for SuiteTalk and one for SuiteQL.

SuiteQL

  • In CData - Connections, add a new source connection for NetSuite. If this option is not in the list, click + Add More, search for NetSuite and click Download & install
  • Name the connection SuiteQL_Connection.
  • The Account Id can be found in the URL for your NetSuite instance: Account Id.app.netsuite.com.
  • Select SuiteQL from the Schema drop-down list.
  • Select Token from the Auth Scheme options and enter the token credentials from the role created in NetSuite.

SuiteTalk

  • In CData - Connections, add a new source connection for NetSuite.
  • Name the connection SuiteTalk_Connection.
  • The Account Id can be found in the URL for your NetSuite instance: Account Id.app.NetSuite.com.
  • Select SuiteTalk from the Schema drop-down list.
  • Select Token from the Auth Scheme options and enter the token credentials from the role created in NetSuite.

Setting up the destination connection in CData Sync

To set up the destination connection, follow the steps as defined in Create a destination connection (Automation Cloud). Note: If you are using Automation Suite, make sure to select AUTOMATION SUITE as the DELIVERY option and select the correct version of Automation Suite you are using.

To be able to extract the data from NetSuite, two jobs need to be set up in CData Sync, one using SuiteTalk as source and one using SuiteQL. Both will use the same destination connection.

SuiteQL

  • In CData - Jobs, create a new job.
  • Select SuiteQL_Connection as source connection, select the destination connection created and create the job.
Advanced job settings

In the Advanced tab in the Job Settings panel, define the following settings:

  • Select the Alter Schema option.
  • Select the Drop Table option.
  • If you are using Automation Suite, add the Destination Schema. Fill out the value you retrieved when you created the destination connection.

Important: Make sure you edit the Pre-job Event.

CData Sync allows the use of environment variables in order to drive specific extraction logic in each query.

VariableDescriptionComment
start_extraction_dateDefines first date for which data will be extracted.Mandatory
end_extraction_dateLast date for which data will be extracted.

Be mindful of choosing a start_extraction_date that encompasses the data that you want to capture, as orders are the starting point of the order to cash process.

In order to setup the environment variables:

StepAction
1Go to the Events tab in the Job Settings panel of the job you are creating
2Edit the Pre-Job Event section to add the code displayed below after <!-- Code goes here -- >. Do not modify the api:info details that are shown by default.
3Make sure the date format matches the date format of NetSuite as noted down in the system configuration.
4Click on Save Changes.

<!-- Modify environment variables here. --> <!-- Variable start_extraction_date must be populated.--> <api:set attr="out.env:start_extraction_date" value="01/01/2022" /> <!-- In case a specific end date is needed, replace the value string with the required date in the Date format listed in NetSuite. --> <!-- i.e api:set attr="out.env:end_extraction_date" value="01/01/2022" --> <api:set attr="out.env:end_extraction_date" value= '12/31/3000' /> <api:push item="out" />

By default, end_extraction_date will default to today's date. start_extraction_date must always be populated.

Table replication

Once the job is correctly setup, click on Add Custom Query under the Tables tab and paste the following queries (each query needs to maintain the semicolon at the end). Make sure you save all changes.

Use the following custom query for SuiteQL when creating the job:

REPLICATE [account] WITH TruncateTableData = 'True' SELECT [id],[accountsearchdisplayname], [accttype], [acctnumber] FROM [account]; REPLICATE [CUSTOMRECORD_NCFAR_ALTDEPRECIATION] WITH TruncateTableData = 'True' SELECT [id],[custrecord_altdeprasset] FROM [CUSTOMRECORD_NCFAR_ALTDEPRECIATION]; REPLICATE [CUSTOMRECORD_NCFAR_ASSETPROPOSAL] WITH TruncateTableData = 'True' SELECT [id], [name], [created], [owner], [custrecord_propasset], [custrecord_propsupplier] FROM [CUSTOMRECORD_NCFAR_ASSETPROPOSAL]; REPLICATE [systemnote] WITH TruncateTableData = 'True' SELECT * FROM [systemnote] WHERE ([field] IN ('CUSTRECORD_PROPASSET', 'CUSTRECORD_PROPSTATUS', 'CUSTRECORD_PROPSOURCEID', 'CUSTRECORD_DEPRHISTDATE', 'CUSTRECORD_ASSETSTATUS', 'CUSTRECORD_ASSETMAINTNEXTDATE', 'CUSTRECORD_ASSETTYPE', 'TRANDOC.KSTATUS', 'TRANDOC.KFORMTEMPLATE', 'TRANDOC.STRANTYPE', 'TRANDOC.NKEY', 'CUSTRECORD_ASSETSOURCETRN')) AND ([date] >= '{env:start_extraction_date}') AND ([date] <= '{env:end_extraction_date}'); REPLICATE [transaction] WITH TruncateTableData = 'True' SELECT [id], [createdby], [createddate], [currency], [duedate], [employee], [entity], [exchangerate], [nexus], [status], [terms], [trandisplayname], [type], [voided] FROM [transaction] WHERE [type] IN ('PurchOrd', 'Journal', 'VendBill', 'Custom') AND ([createddate] >= '{env:start_extraction_date}') AND ([createddate] <= '{env:end_extraction_date}'); REPLICATE [transactionline] WITH TruncateTableData = 'True' SELECT DISTINCT TL.[id], [uniquekey], TL.[createdfrom], [department], TL.[expenseaccount], TL.[entity], [isclosed], [item], [itemtype], [linesequencenumber], [location], [netamount], [quantity], [subsidiary], [taxline], [transaction], [units] FROM [transactionline] AS TL JOIN [transaction] as T ON TL.[transaction] = t.[id] WHERE [type] IN ('PurchOrd', 'Journal', 'VendBill', 'Custom'); REPLICATE [nexus] WITH TruncateTableData = 'True' SELECT [id], [description] FROM [nexus];

Please make sure that the query for transactionline works, as it is a custom case where it is joined to the transaction table in order to filter to only include transaction lines for transactions in the Fixed Asset Management process.

SuiteTalk

  • In CData - Jobs, create a new job.
  • Select SuiteTalk_Connection as source connection, select the destination connection created and create the job.
Advanced job settings

In the Advanced tab in the Job Settings panel, define the following settings:

  • Select the Alter Schema option.
  • Select the Drop Table option.
  • If you are using Automation Suite, add the Destination Schema. Fill out the value you retrieved when you created the destination connection.

Important: Make sure you edit the Pre-job Event.

CData Sync allows the use of environment variables in order to drive specific extraction logic in each query.

VariableDescriptionComment
start_extraction_dateDefines first date for which data will be extracted.Mandatory
end_extraction_dateLast date for which data will be extracted.

Be mindful of choosing a start_extraction_date that encompasses the data that you want to capture, as orders are the starting point of the order to cash process.

In order to setup the environment variables:

StepAction
1Go to the Events tab in the Job Settings panel of the job you are creating
2Edit the Pre-Job Event section to add the code displayed below after <!-- Code goes here -- >. Do not modify the api:info details that are shown by default.
3Make sure the date format matches the date format of NetSuite as noted down in the system configuration.
4Click on Save Changes.

<!-- Modify environment variables here. --> <!-- Variable start_extraction_date must be populated.--> <api:set attr="out.env:start_extraction_date" value="01/01/2022" /> <!-- In case a specific end date is needed, replace the value string with the required date in the Date format listed in NetSuite. --> <!-- i.e api:set attr="out.env:end_extraction_date" value="01/01/2022" --> <api:set attr="out.env:end_extraction_date" value= '12/31/3000' /> <api:push item="out" />

By default, end_extraction_date will default to today's date. start_extraction_date must always be populated.

Setting up the data ingestion call

After the data has been successfully loaded, the Process Mining platform needs to start the data ingestion process. This is done by calling the End of Upload API. In order to set this up, follow the steps below:

StepAction
1Go to the Events tab in the Job Settings panel of the job you are creating
2Edit the Post-Job Event section to add the code displayed below after <!-- Code goes here -- >. Do not modify the api:info details that are shown by default.
3Fill out the End of Upload API with the value provided.
4In case you need a debugging log for this call, uncomment the two lines provided in the code below and provide a location for the log file.
5Click on Save Changes.

<api:set attr="http.url" value="END_OF_UPLOAD_API"/> <!-- <api:set attr="http.verbosity" value="5"/> --> <!-- <api:set attr="http.logfile" value="D:/mydir/cdata_log.txt"/> --> <api:call op="httpPost" in="http"/>

Table replication

Once the job is correctly setup, click on Add Custom Query under the Tables tab and paste the following query. Make sure you save all changes.

Use the following custom query for SuiteTalk when creating the job:

REPLICATE [FAM_Asset] WITH TruncateTableData = 'True' SELECT [InternalId], [Asset Current Cost] AS [Asset_current_cost], [Asset Original Cost] AS [Asset_original_cost], [Asset Is Leased] AS [Asset_is_leased], [Next Inspection Date] AS [Next_inspection_date], [Last Inspection Date] AS [Last_inspection_date], [Lease Company] AS [Lease_company], [Asset Status] AS [Asset_status], [Asset Type] AS [Asset_type], [Component Of] AS [Component_of], [Cumulative Depreciation] AS [Cumulative_depreciation], [Current Net Book Value] AS [Current_net_book_value], [CustomRecordId], [Depreciation Account] AS [Depreciation_account], [Depreciation Charge Account] AS [Depreciation_charge_account], [Depreciation End Date] AS [Depreciation_end_date], [Depreciation Method] AS [Depreciation_method], [Disposal Cost Account] AS [Disposal_cost_account], [Maintenance Company] AS [Maintenance_company], [Name], [Owner_InternalId], [Owner_Name], [Parent Asset] AS [Parent_asset], [Parent Transaction] AS [Parent_transaction], [Parent Transaction Line] AS [Parent_transaction_line], [Prior Year NBV] AS [Prior_year_nbv], [Quantity], [Residual Value] AS [Residual_value], [Custodian], [Location], [Subsidiary], [Supplier], [Write Down Account] AS [Write_down_account], [Write Off Account] AS [Write_off_account] FROM [FAM Asset] AS [FAM_Asset]; REPLICATE [BG_Summary_Records] WITH TruncateTableData = 'True' SELECT [InternalId], [Depreciation Date] AS [Depreciation_date], [Name], [Journal Internal Id] AS [Journal_internal_ID] FROM [BG Summary Records] AS [BG_Summary_Records]; REPLICATE [FAM_Depreciation_History] WITH TruncateTableData = 'True' SELECT [InternalId], [Alternate Method] AS [Alternate_method], [Transaction Type] AS [Transaction_type], [Asset], [Date], [Subsidiary], [Owner_Name], [Owner_InternalId], [Depreciation Period] AS [Depreciation_period], [Name], [Posting Reference] AS [Posting_reference], [Transaction Amount] AS [Transaction_amount] FROM [FAM Depreciation History] AS [FAM_Depreciation_History]; REPLICATE [FAM_Asset_Proposal] WITH TruncateTableData = 'True' SELECT [InternalId], [Accounting Method] AS [Accounting_method], [Asset], [Asset Type] AS [Asset_type], [Custodian], [Depreciation Account] AS [Depreciation_account], [Disposal Cost Account] AS [Disposal_cost_account], [Location], [Source Transaction] AS [Source_transaction], [Write Down Account] AS [Write_down_account], [Write Off Account] AS [Write_off_account], [Proposal Status] AS [Proposal_status], [Original Cost] AS [Original_cost], [Parent Proposal] AS [Parent_proposal], [Quantity], [Accounting Method] AS [Accounting_method], [Custodian], [Owner_Name], [Subsidiary], [Supplier], [Source Transaction] AS [Source_transaction] FROM [FAM Asset Proposal] AS [FAM_Asset_Proposal]; REPLICATE [FAM_Alternate_Depreciation] WITH TruncateTableData = 'True' SELECT [InternalId], [Accounting Book] AS [Accounting_book], [Alternate Method] AS [Alternate_method], [Cumulative Depreciation] AS [Cumulative_depreciation], [Book Value (NBV)] AS [Book_value], [Current Cost] AS [Current_cost], [Original Cost] AS [Original_cost], [Residual Value (RV)] SA [Residual_value], [Depreciation Account] AS [Depreciation_account], [Depreciation Charge Account] AS [Depreciation_charge_account], [Depreciation Method] AS [Depreciation_method], [Depreciation Start Date] AS [Depreciation_start_date], [Depreciation End Date] AS [Depreciation_end_date], [Disposal Cost Account] AS [Disposal_cost_account], [Prior Year NBV] AS [Prior_year_nbv], [Residual Value Percentage] AS [Residual_value_percentage], [Write Down Account] AS [Write_down_account], [Write Off Account] AS [Write_off_account] FROM [FAM Alternate Depreciation] AS [FAM_Alternate_Depreciation];

Input fields

This section contains an overview of the fields for each of the input tables of the Oracle NetSuite Fixed Asset Management app template. For each table the fields are listed.

Below is a list of tables that are brought in with the NetSuite SuiteQL Schema specified:

  • CUSTOMRECORD_NCFAR_ASSETPROPOSAL
  • CUSTOMRECORD_NCFAR_ALTDEPRECIATION
  • nexus
  • systemnote
  • transaction
  • transactionline
  • vendor

The following is a list of tables that are brought in with the NetSuite SuiteTalk Schema specified:

  • FAM_Asset
  • FAM_Asset_Proposal
  • BG_Summary_Records
  • FAM_Depreciation_History
  • FAM_Alternate_Depreciation

For more information on these tables see NetSuite help center. The Analytics Browser tab is for SuiteQL tables.

Input tables & fields

CUSTOMRECORD_NCFAR_ASSETPROPOSAL

FieldData typeLabelFiltering
idTextInternal id
custrecord_propassetTextAsset id
owncustrecord_propsupplierTextProposed Supplier
ownerTextowner
createdDateCreated Date

CUSTOMRECORD_NCFAR_ALTDEPRECIATION

FieldData typeLabelFiltering
custrecord_altdeprassetTextAsset Name
idTextAsset id

nexus

FieldData typeLabelFiltering
idTextInternal id
descriptionTextTax location description

systemnote

FieldData typeLabelFiltering
idTextInternal ID
dateDateDate
fieldTextField where systemnote change occurin ('CUSTRECORD_PROPASSET', 'CUSTRECORD_PROPSTATUS', 'CUSTRECORD_PROPSOURCEID', 'CUSTRECORD_DEPRHISTDATE', 'CUSTRECORD_ASSETSTATUS', 'CUSTRECORD_ASSETMAINTNEXTDATE', 'CUSTRECORD_ASSETTYPE', 'TRANDOC.KSTATUS', 'TRANDOC.KFORMTEMPLATE', 'TRANDOC.STRANTYPE', 'TRANDOC.NKEY', 'CUSTRECORD_ASSETSOURCETRN')
nameTextOwner internal id
newvalueTextNew value
oldvalueTextOld value
recordTextRecord name
recordidTextTransaction id
roleTextUser role
recordtypeidTextRecord type

transaction

FieldData typeLabelFiltering
idTextInternal ID
createdbyTextCreated By
createddateDateDate Created
currencyTextCurrency
duedateDateDue Date
exchangerateDoubleExchange Rate
nexusTextNexus ID
statusTextStatus
trandisplaynameTextTransaction
typeTextTypein ('PurchOrd', 'Journal', 'VendBill', 'Custom')
voidedBooleanVoided

transactionline

This table is joined to the transaction table in order to filter on transaction."type"

FieldData typeLabelFiltering
idTextInternal ID
uniquekeyTextUnique Key
createdfromTextCreated From
expenseaccountTextExpense Account
linesequencenumberTextLine Number
locationTextLocation
netamountDoubleAmount (Net) (Transaction Currency)
quantityDoubleQuantity
subsidiaryTextSubsidiary
taxlineTextTax Line
transactionTextTransaction ID
unitsTextUnit ID

FAM_Asset

FieldData typeLabelFiltering
Internal_idTextInternal id
Next_inspection_dateDateNext inspection date
Last_inspection_dateDateLast inspection date
Asset_current_costDoubleAsset current value
Asset_original_costDoubleAsset original value
Asset_is_leasedBooleanAsset is leased or not
Asset_statusTextAsset status
Asset_typeTextAssert type
Component_ofTextComponent of parent asset (compound assets)
Cumulative_depreciationDoubleTotal asset depreciation
Current_net_book_valueDoubleCurrent asset net book value
Custom_record_idTextCustom asset id
Depreciation_accountTextDepreciation account
Depreciation_charge_accountTextDepreciation charge account
Depreciation_end_dateDateDepreciation end date
Depreciation_methodTextDepreciation method
Disposal_cost_accountTextDisposal account
Lease_companyTextLease company
Maintenance_companyTextMaintenance company
NameTextAsset Name
Owner_nameTextOwner name
Owner_internal_idTextOwner internal id
Parent_assetTextParent asset
Parent_transactionTextParent transaction name
Parent_transaction_lineTextLine number of parent transaction
Prior_year_nbvDoublePrior year net book value
QuantityIntegerQuantity
Residual_valueDoubleResidual value of asset after depreciation
CustodianTextResponsible party
LocationTextLocation
SubsidiaryTextSubsidiary
SupplierTextSupplier
Write_down_accountTextWrite-down account
Write_off_accountTextWrite-off account

FAM_Asset_Proposal

FieldData typeLabelFiltering
Internal_idTextInternal id
AssetTextAsset name
Asset_typeTextAsset type
LocationTextLocation
SupplierTextSupplier
SubsidiaryTextSubsidiary
Depreciation_accountTextDepreciation account
Disposal_cost_accountTextDisposal account
Source_transactionTextParent transaction
Write_down_accountTextWrite-down account
Write_off_accountTextWrite-off account
Proposal_statusTextStatus
Original_costDoubleOriginal cost
Parent_proposalTextParent asset proposal (compound assets)
QuantityDoubleQuantity
Accounting_methodTextAccounting method
CustodianTextResponsible party
Owner_nameTextCreator

BG_Summary_Records

FieldData typeLabelFiltering
Internal_idTextInternal ID
Depreciation_dateDateDepreciation date
Journal_internal_idTextJournal transaction ID
NameTextBG Summary Record Name

FAM_Depreciation_History

FieldData typeLabelFiltering
Internal_IDTextInternal ID
Alternate_methodTextAlternate Depreciation Method
Transaction_typeTextTransaction type
Transaction_amountDoubleTransaction Amount
AssetTextAsset name
DateDateDate
SubsidiaryTextSubsidiary
Owner_nameTextCreator
Owner_internal_IDTextCreator internal ID
Posting_referenceTextDepreciation Posting Reference
Depreciation_preiodTextDepreciation period
NameTextUnique Name of Depreciation Journal (Script Name)

FAM_Alternate_Depreciation

FieldData typeLabelFiltering
Internal_IDTextInternal ID
Accounting_bookTextAccounting book
Alternate_methodTextAlternate method
Cumulative_depreciationDoubleCumulative depreciation
Book_valueDoubleAsset book value
Current_costsDoubleAsset current cost
Original_costsDoubleAsset original cost
Residual_valueDoubleResidual value
Depreciation_accountTextDepreciation account
Depreciation_charge_accountTextDepreciation charge account
Depreciation_methodTextDepreciation method
Depreciation_start_dateDateDepreciation start date
Depreciation_end_dateDateDepreciation end date
Disposal_cost_accountTextDisposal account
Prior_year_nbvDoublePrior year net book value
Residual_value_percentageDoubleResidual value percentage
Write_down_accountTextWrite-down account
Write_off_accountTextWrite-off account

Design specifications

Objects

Below is an overview of the objects, and their attributes, of the Oracle NetSuite Fixed Asset Management app template.

Asset_proposals

NameAttributeData typeMandatory Y/NDescription
Asset_proposal_IDcoalesce(Asset_input."Custom_record_id", concat('PROP-00',Aggregated_proposals."id") )TextYUnique identifier of asset or asset proposal
Asset_proposalcoalesce(Asset_input."Custom_record_id", concat('PROP-00',Aggregated_proposals."id") )TextNDisplay name of asset or asset proposal
Namecoalesce(Asset_input."Name", Aggregated_proposals."Asset")TextNAlternate display name of asset or asset proposal
Typecoalesce(Asset_input."Asset_type", Aggregated_proposals."Asset_type")TextNAsset or asset proposal type
Statuscoalesce(Asset_input."Asset_status", Aggregated_proposals."Proposal_status")TextNAsset or asset proposal status
Book_valuecoalesce(Asset_input."Current_Net_Book_Value", Aggregated_proposals."Original_cost")DoubleNAsset or asset proposal value
Parent_transactioncoalesce(Asset_input."Parent_transaction", Aggregated_proposals."Source_transaction")TextNAsset or asset proposal parent transaction
Locationcoalesce(Asset_input."Location", Aggregated_proposals."Location")TextNAsset or asset proposal parent transaction
Maintenance_companyAsset_input."Maintenance_company"TextNAsset or asset proposal parent transaction
Parentcoalesce(Asset_input."Parent_asset", Aggregated_proposals."Parent_proposal")TextNAsset or asset proposal parent asset
Parent_assetAsset_input."Component_of"TextNAsset or asset proposal parent compound asset
Quantitycoalesce(Asset_input."Quantity", Aggregated_proposals."Quantity")TextNAsset or asset proposal quantity
Subsidiarycoalesce(Asset_input."Subsidiary", Aggregated_proposals."Subsidiary")TextNAsset or asset proposal subsidiary
Suppliercoalesce(Asset_input."Supplier", Aggregated_proposals."Supplier")TextNAsset or asset proposal supplier
Write_down_accountcoalesce(Asset_input."Write_down_account", Aggregated_proposals."Write_down_account")TextNAsset or asset proposal write down account
Write_off_accountcoalesce(Asset_input."Write_off_account", Aggregated_proposals."Write_off_account")TextNAsset or asset proposal write off account
Depreciation_accountcoalesce(Asset_input."Depreciation_account", Aggregated_proposals."Depreciation_account")TextNAsset or asset proposal depreciation account
Depreciation_methodcase when Alternate_depreciations."Alternate_method" is null then coalesce(Asset_input."Depreciation_method", Aggregated_proposals."Accounting_method")else Alternate_depreciations."Alternate_method"TextNAsset or asset proposal depreciation method
Custodiancoalesce(Asset_input."Depreciation_account", Aggregated_proposals."Depreciation_account")TextNAsset or asset proposal custodian
Alternate Depreciation Methodcoalesce(Alternate_depreciations."Alternate_method")TextNAsset Alternate Depreciation Method
Alternate_current_costAlternate_depreciations."Current_costs"TextNAlternate asset Current Cost
Alternate_original_costAlternate_depreciations."Original_costs"TextNAlternate asset Original Cost
Alternate_book_valueAlternate_depreciations."Book_value"TextNAlternate asset Book Value (sale as Asset proposal value)
Disposal Accountcoalesce(Asset_input."Disposal_cost_account", Aggregated_proposals."Disposal_cost_account")TextNAsset or asset Disposal Account
Leasing_companyAsset_input."Lease_company"TextNAsset Leasing Company
Residual_valueAsset_input."Residual_value"TextNAsset Residual Value
Asset_original_costAsset_input."Asset_original_cost"TextNAsset Original Cost
Asset_current_costAsset_input."Asset_original_cost"TextNAsset current Cost
Cumulative_depreciationAsset_input."Cumulative_depreciation"TextNAsset Cumulative Depreciation

Aggregated_proposals

Aggregated_proposals is a combination of SuiteQL and SuiteTalk Asset proposal inputs to create a singular object with requisite fields.

NameAttributeData typeMandatory Y/NDescription
IDSuiteQL_proposals."ID"TextYUnique identifier of the asset proposal
Custrecord_propassetSuiteQL_proposals."Custrecord_propasset"TextYRelation of the asset proposal to asset
AssetSuiteTalk_proposals."Asset"TextNName of the asset proposal
Asset_typeSuiteTalk_proposals."Asset_type"TextNAsset proposal type
LocationSuiteTalk_proposals."Location"TextNProposed asset location
SupplierSuiteTalk_proposals."Supplier"TextNSupplier of proposed asset
SubsidiarySuiteTalk_proposals."Subsidiary"TextNSubsidiary requesting asset proposal
Depreciation_accountSuiteTalk_proposals."Depreciation_account"TextNAsset proposal depreciation account
Source_transactionSuiteTalk_proposals."Source_transaction"TextNParent transaction of asset proposal
Write_down_accountSuiteTalk_proposals."Write_down_account"TextNAsset proposal write-down account
Write_off_accountSuiteTalk_proposals."Write_off_account"TextNAsset proposal write-off account
Proposal_statusSuiteTalk_proposals."Proposal_status"TextNAsset proposal status
Original_costSuiteTalk_proposals."Original_cost"TextNOriginal cost of asset proposal
Parent_proposalSuiteTalk_proposals."Parent_proposal"TextNParent of asset proposal
QuantitySuiteTalk_proposals."Quantity"TextNAsset proposal quantity
Accounting_methodSuiteTalk_proposals."Accounting_method"TextNAsset proposal accounting method
CustodianSuiteTalk_proposals."Custodian"TextNAsset proposal custodian
Owner_nameSuiteTalk_proposals."Owner_name"TextNOwner of asset proposal
Disposal_cost_accountSuiteTalk_proposals."Disposal_cost_account"TextNDisposal account of asset proposal

Activities

A break down of the activities is listed below, based on each model that contains the activity:

Acquire Asset

This identifies the acquisition action of an asset.

Acquire Asset via Transfer

This identifies the movement of an asset to another location.

Create Asset

This identifies the creation of an asset from asset proposal.

Systemnote_input."New_value" = 'New'

Fully Depreciated Asset

This identifies a an asset's full depreciation.

Systemnote_input."New_value" = 'Fully Depreciated'

Splitting Asset

This identifies an asset being split.

Systemnote_input."New_value" = 'Splitting'

Depreciate Asset

This identifies the depreciation of an asset.

Depreciation_history."Transaction_type" = 'Depreciation'

Depreciate Asset (tax)

This identifies the alternate tax depreciation of an asset.

Depreciation_history."Transaction_type" = 'Depreciation' where Depreciation_history."Alternate_method" is not null

Dispose Asset

This identifies the disposal of an asset.

Journal Entry - Debit

This identifies a debit journal entry.

when transactionline."Net_amount" < 0

Journal Entry - Credit

This identifies a credit journal entry.

when transactionline."Net_amount" > 0

Proposed manual depreciation

This identifies a manual depreciation.

systemnote."Field" = 'TRANDOC.KSTATUS' and systemnote."New_value" = 'Pending Approval'

Approved manual depreciation

This identifies the approval of the manual depreciation.

systemnote."Field" = 'TRANDOC.KSTATUS' and systemnote."New_value" = 'Approved'

Propose Asset

This identifies the creation of an asset proposal.

Systemnote_input."New_value" = 'New'

Reject Asset

This identifies the rejection of an asset proposal.

Systemnote_input."New_value" = 'Rejected'

Revalue Asset

This identifies the revaluation, or write-down, of an asset.

Depreciation_history where "Transaction_type" = 'Write-down'

Transfer Asset

This identifies the transfer of an asset.

Depreciation_history where "Transaction_type" = 'Transfer'

Customizing the transformations

Seed files

Automation_estimates_raw

This seed file is used to add automation-related properties to each activity, used for the automation potential dashboard. For more information, see Simulating Automation Potential.

FieldTypeDescription
ActivityTextDisplay name for the activity
Event_costDoubleCost associated with the activity
Event_processing_timeIntegerProcessing time associated with the activity (in milliseconds)

Due_dates_configuration_raw

This seed file is used to define properties for the due dates. For more information, see Due Dates.

FieldTypeDescription
Due_dateTextThe name of the due date
Due_date_typeTextThe Due date type
Fixed_costsBooleanAn indication whether costs are fixed or time based
CostDoubleFixed costs: The amount of costs. Variable costs: The amount of costs per Time and Time_type
TimeIntegerA number indicating the amount of time in case of time-based costs
Time_typeTextType of time period for cost calculations. This can be any of the following values: day, hour, minute, second or millisecond

Automated Users

A variable exists in dbt_project.yml called Automated_users for users to specify the automated users that exist in the Object table. Please add the object.id for these users to this variable.

Limitations, known issues, common problems

Limitations

NetSuite SuiteQL relies on some incredibly large tables for its data, which can be filtered by specifying the record types required. Not filtering on these can cause a lot of performance issues, and will replicate a lot of superfluous data.

If you plan on using CSV files and are going to be using the SQL Query Editor for exporting the SuiteQL tables, the SQL Query Editor tool only allows for up to 5,000 rows to be exported in each query. If more rows are needed, one can filter based on date, and add the results together into a larger file.

Void activities are built with NetSuite having Void transactions using reversing disabled. In NetSuite, go to Setup -> Accounting -> Accounting Preferences to check.

The Asset ID used in events is created as left(Depreciation_history."Asset", 9). Please make sure that the number of characters required to capture the asset ID is 9, or this will need to be changed to grab the correct Asset ID.

When exporting data directly from NetSuite, -System- and (-4), the Owner_Name and Owner_InternalId respectively, do not appear. This will not capture automated actions as this is not present in the data. If you would like to have blank values appear as "Automated", add the following wherever Owner_InternalId is used for defining "Automated_Users":

case when Depreciation_history."Owner_internal_id" is null then {{ pm_utils.to_boolean('true') }}

Known issues

NetSuite is structurally built around the header level, so tracking item level changes requires utilizing a mixture of SuiteTalk and SuiteQL Schemas to find and pull the requisite data for process mining.

If you encounter errors when running a job that state column not found, go to the Advanced tab of the NetSuite Connection and set the Row Scan Depth: to 0

Common problems

CData Sync may exhibit some issues in filtering the extraction tables on multiple values, so this is something to keep in mind if you do encounter similar issues.

ncG1vNJzZmiZoKXBprnPpZitnaOZvKS%2FjZujqJpemLyzsY2woKecn6zAb7rErWadp5Oquqa605qroqeeZMKqvMCtn395fYOytb%2FUoqueZ3%2BnrqS4xGaFnqyDqra1sYx%2FoLGdlGKOtL%2FErWSGmZ6WtKa5xKerZ6Ckork%3D