#!/usr/bin/env node
/**
* Get Bank Leumi monthly breakdown for last 8 months with corrected division ID
*/
const { spawn } = require('child_process');
const path = require('path');
console.log('π¦ BANK LEUMI - MONTHLY BREAKDOWN (LAST 8 MONTHS)');
console.log('β'.repeat(80));
console.log('Using Division ID 139 (corrected)');
console.log('β'.repeat(80));
// Calculate 8 months back
const today = new Date();
const eightMonthsAgo = new Date(today);
eightMonthsAgo.setMonth(today.getMonth() - 8);
eightMonthsAgo.setDate(1);
const startDate = eightMonthsAgo.toISOString().split('T')[0];
const endDate = today.toISOString().split('T')[0];
console.log(`π
Period: ${startDate} to ${endDate}\n`);
const serverPath = path.join(__dirname, 'src', 'index.ts');
const server = spawn('npx', ['tsx', serverPath], {
env: { ...process.env },
stdio: ['pipe', 'pipe', 'pipe']
});
let responses = {};
let responseBuffer = '';
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', (data) => {
const output = data.toString();
if (output.includes('Umbrella MCP Server started successfully')) {
setTimeout(() => runAnalysis(), 1000);
}
});
async function runAnalysis() {
console.log('π Starting Bank Leumi monthly analysis...\n');
// Initialize
server.stdin.write(JSON.stringify({
jsonrpc: '2.0',
method: 'initialize',
params: { protocolVersion: '0.1.0', capabilities: {}, clientInfo: { name: 'leumi-monthly', version: '1.0.0' }},
id: 0
}) + '\n');
await new Promise(resolve => setTimeout(resolve, 2000));
// Authenticate
console.log('π Authenticating...');
server.stdin.write(JSON.stringify({
jsonrpc: '2.0',
method: 'tools/call',
params: {
name: 'authenticate_user',
arguments: {
username: 'david+allcloud@umbrellacost.com',
password: 'B4*zcI7#F7poEC'
}
},
id: 1
}) + '\n');
await new Promise(resolve => setTimeout(resolve, 10000));
console.log('β
Authenticated\n');
// Get Bank Leumi monthly costs
console.log('π Requesting Bank Leumi monthly breakdown...\n');
server.stdin.write(JSON.stringify({
jsonrpc: '2.0',
method: 'tools/call',
params: {
name: 'api___invoices_caui',
arguments: {
userQuery: 'Show me Bank Leumi costs by month',
startDate: startDate,
endDate: endDate,
groupBy: 'none',
periodGranLevel: 'month',
costType: ['cost', 'discount'],
isUnblended: true,
cloud_context: 'aws'
}
},
id: 2
}) + '\n');
await new Promise(resolve => setTimeout(resolve, 15000));
displayMonthlyBreakdown();
}
function displayMonthlyBreakdown() {
console.log('π° **BANK LEUMI - MONTHLY COST BREAKDOWN**');
console.log('β'.repeat(80));
if (!responses[2]) {
console.log('β No response received');
server.kill();
return;
}
if (responses[2].error) {
console.log('β Request error:', responses[2].error);
server.kill();
return;
}
const content = responses[2].result?.content?.find(c => c.type === 'text')?.text || '';
const jsonMatch = content.match(/```json\n([\s\S]*?)\n```/);
if (jsonMatch) {
try {
const data = JSON.parse(jsonMatch[1]);
if (Array.isArray(data) && data.length > 0) {
const monthNames = {
'01': 'January', '02': 'February', '03': 'March', '04': 'April',
'05': 'May', '06': 'June', '07': 'July', '08': 'August',
'09': 'September', '10': 'October', '11': 'November', '12': 'December'
};
let totalCost = 0;
const monthlyData = [];
console.log('π
**MONTH-BY-MONTH BREAKDOWN:**\n');
data.forEach((item, index) => {
const [year, month] = (item.usage_date || '').split('-');
const monthName = monthNames[month] || month;
const cost = parseFloat(item.total_cost || 0);
totalCost += cost;
monthlyData.push({
month: `${monthName} ${year}`,
cost: cost
});
const costDisplay = cost < 0 ?
`-$${Math.abs(cost).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})}` :
`$${cost.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})}`;
const indicator = cost > 1000 ? 'π°' : cost > 0 ? 'π΅' : cost < 0 ? 'πΈ' : 'βͺ';
console.log(`Month ${index + 1}: **${monthName} ${year}**`);
console.log(`${indicator} Cost: ${costDisplay}`);
// Add trend if not first month
if (index > 0) {
const prevCost = parseFloat(data[index-1].total_cost || 0);
const change = cost - prevCost;
const changePercent = prevCost !== 0 ? ((change / Math.abs(prevCost)) * 100) : 0;
const trend = change > 0 ? 'βοΈ Increase' : change < 0 ? 'βοΈ Decrease' : 'β No change';
const changeDisplay = change < 0 ?
`-$${Math.abs(change).toLocaleString('en-US', {minimumFractionDigits: 2})}` :
`+$${change.toLocaleString('en-US', {minimumFractionDigits: 2})}`;
console.log(`π Change from previous: ${changeDisplay} (${changePercent.toFixed(1)}%) ${trend}`);
}
console.log('β'.repeat(60));
});
console.log('\nπ **SUMMARY:**');
console.log('β'.repeat(40));
console.log(`π
Months with data: ${data.length}`);
console.log(`π° Total cost: $${totalCost.toLocaleString('en-US', {minimumFractionDigits: 2})}`);
console.log(`π Average monthly: $${(totalCost / data.length).toLocaleString('en-US', {minimumFractionDigits: 2})}`);
// Find highest and lowest
const sorted = [...monthlyData].sort((a, b) => b.cost - a.cost);
if (sorted.length > 0) {
console.log(`π Highest month: ${sorted[0].month} ($${sorted[0].cost.toLocaleString('en-US', {minimumFractionDigits: 2})})`);
console.log(`π Lowest month: ${sorted[sorted.length-1].month} ($${sorted[sorted.length-1].cost.toLocaleString('en-US', {minimumFractionDigits: 2})})`);
}
console.log('\nβ
**DATA VERIFICATION:**');
console.log(`- Account Key: 22676`);
console.log(`- Division ID: 139 (from customerDivisions)`);
console.log(`- Account Name: Reseller-1`);
console.log(`- Cloud: AWS`);
} else {
console.log('β οΈ No data returned or empty array');
}
} catch (e) {
console.log('β Error parsing data:', e.message);
}
} else {
console.log('β οΈ No JSON data found in response');
}
console.log('\nπ¦ **BANK LEUMI MONTHLY ANALYSIS COMPLETE**');
console.log('β'.repeat(80));
server.kill();
}
setTimeout(() => {
console.error('β Analysis timeout');
server.kill();
process.exit(1);
}, 35000);