UNPKG

n8n-nodes-plaid

Version:

The definitive Plaid financial integration node for n8n - Zero Dependencies for Cloud Verification

86 lines (85 loc) 2.96 kB
"use strict"; 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;