n8n-nodes-plaid
Version:
The definitive Plaid financial integration node for n8n - Zero Dependencies for Cloud Verification
86 lines (85 loc) • 2.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PlaidHelpers = void 0;
class PlaidHelpers {
/**
* Get Plaid environment URL
*/
static getEnvironmentUrl(environment) {
return environment === 'production'
? 'https://production.plaid.com'
: 'https://sandbox.plaid.com';
}
/**
* Format transaction amount (Plaid returns negative for outflow)
*/
static formatTransactionAmount(amount) {
return {
amount: Math.abs(amount),
type: amount < 0 ? 'expense' : 'income',
};
}
/**
* Parse account IDs from comma-separated string
*/
static parseAccountIds(accountIds) {
if (!accountIds.trim())
return undefined;
return accountIds.split(',').map(id => id.trim()).filter(Boolean);
}
/**
* Format date for Plaid API (YYYY-MM-DD)
*/
static formatDate(dateString) {
return dateString.split('T')[0];
}
/**
* Enhanced categorization mapping
*/
static enhanceCategories(transaction) {
const categories = transaction.category || [];
const personalFinanceCategory = transaction.personal_finance_category;
return {
...transaction,
category_primary: categories[0] || 'Other',
category_secondary: categories[1] || '',
category_detailed: categories[2] || '',
category_full: categories.join(' > ') || 'Other',
enhanced_category: personalFinanceCategory?.primary || categories[0] || 'Other',
enhanced_subcategory: personalFinanceCategory?.detailed || categories[1] || '',
};
}
/**
* Detect recurring transactions
*/
static detectRecurring(description) {
const recurringKeywords = [
'netflix', 'spotify', 'subscription', 'monthly', 'annual',
'insurance', 'mortgage', 'rent', 'gym', 'membership',
'utilities', 'phone', 'internet', 'recurring'
];
const lowerDesc = description.toLowerCase();
return recurringKeywords.some(keyword => lowerDesc.includes(keyword));
}
/**
* Calculate spending score based on amount and category
*/
static calculateSpendingScore(amount, categories) {
const absAmount = Math.abs(amount);
let score = Math.min(absAmount / 100, 10); // Base score 0-10
// Adjust based on category
const categoryMultipliers = {
'Food and Drink': 1.0,
'Shops': 1.2,
'Recreation': 1.3,
'Transportation': 0.8,
'Healthcare': 0.7,
'Bills': 0.5,
'Transfer': 0.3,
};
const primaryCategory = categories?.[0];
const multiplier = categoryMultipliers[primaryCategory] || 1.0;
return Math.round(score * multiplier * 10) / 10;
}
}
exports.PlaidHelpers = PlaidHelpers;