#!/usr/bin/env node
/**
* Analyze division structure to understand where Bank Leumi might be
*/
const { spawn } = require('child_process');
async function analyzeDivisions() {
console.log('🔍 ANALYZING DIVISION STRUCTURE');
console.log('=' .repeat(50));
const server = spawn('node', ['dist/index.js'], {
stdio: ['pipe', 'pipe', 'pipe'],
env: process.env
});
let responses = {};
let responseBuffer = '';
let divisionData = {
divisionIds: new Set(),
accountsByDivision: new Map()
};
server.stdout.on('data', (data) => {
responseBuffer += data.toString();
const lines = responseBuffer.split('\n');
for (let i = 0; i < lines.length - 1; i++) {
const line = lines[i].trim();
if (line) {
try {
const response = JSON.parse(line);
if (response.id) {
responses[response.id] = response;
}
} catch (e) {}
}
}
responseBuffer = lines[lines.length - 1];
});
server.stderr.on('data', () => {
// Suppress debug output to focus on analysis
});
await new Promise(resolve => setTimeout(resolve, 2000));
// Initialize and authenticate
server.stdin.write('{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{},"clientInfo":{"name":"div-analysis","version":"1.0.0"}}}\n');
await new Promise(resolve => setTimeout(resolve, 1000));
server.stdin.write(JSON.stringify({
jsonrpc: "2.0", id: 2, method: "tools/call",
params: { name: "authenticate_user", arguments: {
username: "david+allcloud@umbrellacost.com",
password: "B4*zcI7#F7poEC"
}}
}) + '\n');
await new Promise(resolve => setTimeout(resolve, 8000));
// Get users data to analyze division structure
server.stdin.write('{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"api___users","arguments":{}}}\n');
await new Promise(resolve => setTimeout(resolve, 8000));
server.kill();
// Analyze the users response
if (responses[3]?.result?.content?.[0]?.text) {
const text = responses[3].result.content[0].text;
try {
const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
if (jsonMatch) {
const userData = JSON.parse(jsonMatch[1]);
console.log('📊 DIVISION ANALYSIS:');
console.log('=' .repeat(50));
// Analyze divisionsIds array
if (userData.divisionsIds) {
const uniqueDivisions = [...new Set(userData.divisionsIds)].sort((a,b) => a-b);
console.log(`\n🎯 Found ${uniqueDivisions.length} unique division IDs:`);
uniqueDivisions.forEach(divId => {
const count = userData.divisionsIds.filter(id => id === divId).length;
console.log(` Division ${divId}: ${count} occurrences`);
});
const nonZeroDivisions = uniqueDivisions.filter(id => id !== 0);
console.log(`\n✅ Non-zero divisions (real customers): ${nonZeroDivisions.join(', ')}`);
}
// Analyze accounts by division
if (userData.accounts) {
console.log(`\n📋 ACCOUNTS BY DIVISION (${userData.accounts.length} total accounts):`);
const divisionGroups = new Map();
userData.accounts.forEach(account => {
const divId = account.divisionId || 0;
if (!divisionGroups.has(divId)) {
divisionGroups.set(divId, []);
}
divisionGroups.get(divId).push(account);
});
// Sort by division ID
const sortedDivisions = Array.from(divisionGroups.keys()).sort((a,b) => a-b);
sortedDivisions.forEach(divId => {
const accounts = divisionGroups.get(divId);
console.log(`\n 📁 Division ${divId} (${divId === 0 ? 'Unassigned' : 'CUSTOMER'}): ${accounts.length} accounts`);
if (divId !== 0) {
// This is a real customer division - show details
console.log(` 🏢 CUSTOMER DIVISION - These accounts belong to a customer:`);
accounts.slice(0, 5).forEach((acc, index) => {
console.log(` ${index + 1}. ${acc.accountName} (Key: ${acc.accountKey})`);
});
if (accounts.length > 5) {
console.log(` ... and ${accounts.length - 5} more accounts`);
}
// Check for bank-like account names
const bankAccounts = accounts.filter(acc =>
acc.accountName.toLowerCase().includes('bank') ||
acc.accountName.toLowerCase().includes('leumi') ||
acc.accountName.toLowerCase().includes('hapoalim')
);
if (bankAccounts.length > 0) {
console.log(` 🏦 BANK ACCOUNTS IN THIS DIVISION:`);
bankAccounts.forEach(acc => {
console.log(` 🎯 ${acc.accountName} (Key: ${acc.accountKey})`);
});
}
} else {
// Division 0 - show first few examples
console.log(` Examples: ${accounts.slice(0, 3).map(a => a.accountName).join(', ')}`);
}
});
// Key findings
const customerDivisions = sortedDivisions.filter(id => id !== 0);
console.log(`\n🎯 KEY FINDINGS:`);
console.log(` Total customer divisions: ${customerDivisions.length}`);
console.log(` Customer division IDs: ${customerDivisions.join(', ')}`);
if (customerDivisions.length > 0) {
console.log(`\n💡 IMPORTANT: Bank Leumi likely exists as one of these customer divisions.`);
console.log(` The division NAME (like "Bank Leumi") is stored separately from this account data.`);
console.log(` Each division ID corresponds to a customer name in the USER_DIVISIONS table.`);
customerDivisions.forEach(divId => {
const accounts = divisionGroups.get(divId);
console.log(`\n 🔍 Division ${divId} could be "Bank Leumi" with ${accounts.length} accounts:`);
const accountKeys = accounts.map(acc => acc.accountKey);
console.log(` Account Keys: ${accountKeys.join(', ')}`);
});
} else {
console.log(`\n⚠️ No customer divisions found - all accounts in division 0 (unassigned)`);
console.log(` This suggests either:`);
console.log(` 1. This user doesn't have access to customer divisions`);
console.log(` 2. Bank Leumi is in a different MSP environment`);
console.log(` 3. The division structure is not properly configured`);
}
}
} else {
console.log('❌ Could not find JSON in users response');
}
} catch (e) {
console.log('❌ Error parsing users response:', e.message);
}
} else {
console.log('❌ No users response received');
}
console.log('\n✅ Division structure analysis complete');
}
analyzeDivisions().catch(console.error);