@memberjunction/actions-bizapps-accounting
Version:
Accounting system integration actions for MemberJunction
234 lines • 9.47 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetBusinessCentralGLAccountsAction = void 0;
const global_1 = require("@memberjunction/global");
const business_central_base_action_1 = require("../business-central-base.action");
const actions_1 = require("@memberjunction/actions");
/**
* Action to retrieve the Chart of Accounts from Microsoft Dynamics 365 Business Central
*/
let GetBusinessCentralGLAccountsAction = class GetBusinessCentralGLAccountsAction extends business_central_base_action_1.BusinessCentralBaseAction {
/**
* Description of the action
*/
get Description() {
return 'Retrieves the Chart of Accounts (GL Accounts) from Microsoft Dynamics 365 Business Central';
}
/**
* Main execution method
*/
async InternalRunAction(params) {
try {
const contextUser = params.ContextUser;
if (!contextUser) {
return {
Success: false,
ResultCode: 'ERROR',
Message: 'Context user is required for Business Central API calls'
};
}
// Store params for base class methods
this.params = params.Params;
// Build filters based on parameters
const filters = [];
const includeBlocked = this.getParamValue(params.Params, 'IncludeBlocked');
if (!includeBlocked) {
filters.push("blocked eq false");
}
const accountTypes = this.getParamValue(params.Params, 'AccountTypes');
if (accountTypes) {
const types = accountTypes.split(',').map((t) => t.trim());
const typeFilters = types.map((type) => `accountType eq '${type}'`);
if (typeFilters.length > 0) {
filters.push(`(${typeFilters.join(' or ')})`);
}
}
const categories = this.getParamValue(params.Params, 'Categories');
if (categories) {
const cats = categories.split(',').map((c) => c.trim());
const catFilters = cats.map((cat) => `category eq '${cat}'`);
if (catFilters.length > 0) {
filters.push(`(${catFilters.join(' or ')})`);
}
}
const minBalance = this.getParamValue(params.Params, 'MinBalance');
if (minBalance !== undefined) {
filters.push(`balance ge ${minBalance}`);
}
const maxBalance = this.getParamValue(params.Params, 'MaxBalance');
if (maxBalance !== undefined) {
filters.push(`balance le ${maxBalance}`);
}
// Select fields to retrieve
const select = [
'id',
'number',
'displayName',
'category',
'subCategory',
'accountType',
'directPosting',
'balance',
'blocked',
'lastModifiedDateTime',
'netChange',
'debitAmount',
'creditAmount',
'indentation'
];
// Order by
const orderBy = 'number';
// Max results
const maxResults = this.getParamValue(params.Params, 'MaxResults') || 1000;
// Execute the query
const response = await this.queryBC('generalLedgerAccounts', filters, select, undefined, orderBy, maxResults, contextUser);
const bcAccounts = response.value || [];
const glAccounts = bcAccounts.map(account => this.mapBCAccountToGLAccount(account));
// Calculate summary
const summary = this.calculateAccountSummary(glAccounts);
// Create output parameters
if (!params.Params.find(p => p.Name === 'GLAccounts')) {
params.Params.push({
Name: 'GLAccounts',
Type: 'Output',
Value: glAccounts
});
}
else {
params.Params.find(p => p.Name === 'GLAccounts').Value = glAccounts;
}
if (!params.Params.find(p => p.Name === 'TotalCount')) {
params.Params.push({
Name: 'TotalCount',
Type: 'Output',
Value: glAccounts.length
});
}
else {
params.Params.find(p => p.Name === 'TotalCount').Value = glAccounts.length;
}
if (!params.Params.find(p => p.Name === 'Summary')) {
params.Params.push({
Name: 'Summary',
Type: 'Output',
Value: summary
});
}
else {
params.Params.find(p => p.Name === 'Summary').Value = summary;
}
return {
Success: true,
ResultCode: 'SUCCESS',
Message: `Successfully retrieved ${glAccounts.length} GL accounts from Business Central`
};
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
return {
Success: false,
ResultCode: 'ERROR',
Message: errorMessage
};
}
}
/**
* Maps a Business Central account to our standard GL Account interface
*/
mapBCAccountToGLAccount(bcAccount) {
return {
id: bcAccount.id,
number: bcAccount.number,
displayName: bcAccount.displayName,
category: bcAccount.category,
subCategory: bcAccount.subCategory || '',
accountType: bcAccount.accountType,
directPosting: bcAccount.directPosting || false,
balance: bcAccount.balance || 0,
blocked: bcAccount.blocked || false,
lastModifiedDateTime: this.parseBCDate(bcAccount.lastModifiedDateTime),
netChange: bcAccount.netChange || 0,
debitAmount: bcAccount.debitAmount || 0,
creditAmount: bcAccount.creditAmount || 0,
indentation: bcAccount.indentation || 0
};
}
/**
* Calculate account summary statistics
*/
calculateAccountSummary(accounts) {
const summary = {
totalAccounts: accounts.length,
activeAccounts: accounts.filter(a => !a.blocked).length,
blockedAccounts: accounts.filter(a => a.blocked).length,
postingAccounts: accounts.filter(a => a.directPosting).length,
headerAccounts: accounts.filter(a => !a.directPosting).length,
accountsByCategory: {},
accountsByType: {},
totalDebit: 0,
totalCredit: 0,
netBalance: 0
};
accounts.forEach(account => {
// Count by category
summary.accountsByCategory[account.category] = (summary.accountsByCategory[account.category] || 0) + 1;
// Count by type
summary.accountsByType[account.accountType] = (summary.accountsByType[account.accountType] || 0) + 1;
// Sum totals
summary.totalDebit += account.debitAmount;
summary.totalCredit += account.creditAmount;
summary.netBalance += account.balance;
});
return summary;
}
/**
* Define the parameters for this action
*/
get Params() {
const baseParams = this.getCommonAccountingParams();
const specificParams = [
{
Name: 'IncludeBlocked',
Type: 'Input',
Value: false
},
{
Name: 'AccountTypes',
Type: 'Input',
Value: null
},
{
Name: 'Categories',
Type: 'Input',
Value: null
},
{
Name: 'MinBalance',
Type: 'Input',
Value: null
},
{
Name: 'MaxBalance',
Type: 'Input',
Value: null
},
{
Name: 'MaxResults',
Type: 'Input',
Value: 1000
}
];
return [...baseParams, ...specificParams];
}
};
exports.GetBusinessCentralGLAccountsAction = GetBusinessCentralGLAccountsAction;
exports.GetBusinessCentralGLAccountsAction = GetBusinessCentralGLAccountsAction = __decorate([
(0, global_1.RegisterClass)(actions_1.BaseAction, 'GetBusinessCentralGLAccountsAction')
], GetBusinessCentralGLAccountsAction);
//# sourceMappingURL=get-gl-accounts.action.js.map