#!/usr/bin/env node
const { spawn } = require('child_process');
class BankHapoalimDiscounts {
constructor() {
this.server = null;
this.requestId = 1;
}
async start() {
console.log('🏦 BANK HAPOALIM COSTS WITH/WITHOUT DISCOUNTS');
console.log('==============================================');
this.server = spawn('node', ['dist/index.js'], {
stdio: ['pipe', 'pipe', 'pipe']
});
await new Promise(resolve => setTimeout(resolve, 3000));
console.log('✅ Server ready\n');
}
async sendRequest(method, params = {}) {
return new Promise((resolve, reject) => {
const request = {
jsonrpc: '2.0',
id: this.requestId++,
method,
params
};
this.server.stdin.write(JSON.stringify(request) + '\n');
const timeout = setTimeout(() => {
reject(new Error(`Timeout: ${method}`));
}, 30000);
const handleData = (data) => {
clearTimeout(timeout);
this.server.stdout.removeListener('data', handleData);
try {
const lines = data.toString().split('\n').filter(line => line.trim());
for (let i = lines.length - 1; i >= 0; i--) {
const line = lines[i];
if (line.trim()) {
try {
const response = JSON.parse(line);
resolve(response);
return;
} catch (e) {
continue;
}
}
}
reject(new Error('No valid JSON response found'));
} catch (error) {
reject(error);
}
};
this.server.stdout.on('data', handleData);
});
}
async getCostData() {
try {
console.log('🔧 Initialize and Authenticate');
await this.sendRequest('initialize', {
protocolVersion: '2024-11-05',
capabilities: {},
clientInfo: { name: 'Bank Hapoalim Discounts', version: '1.0.0' }
});
await this.sendRequest('tools/call', {
name: 'authenticate_user',
arguments: {
username: 'david+allcloud@umbrellacost.com',
password: 'B4*zcI7#F7poEC'
}
});
console.log('✅ Authenticated\n');
// Test 1: COST ONLY (no discounts)
console.log('💰 TEST 1: COST ONLY (costType: ["cost"])');
console.log('=========================================\n');
const costOnlyResp = await this.sendRequest('tools/call', {
name: 'api___invoices_caui',
arguments: {
startDate: '2025-08-01',
endDate: '2025-08-31',
costType: ['cost'], // Only cost, no discount
groupBy: 'none',
periodGranLevel: 'month',
isUnblended: true,
cloud_context: 'aws',
customer_account_key: '16185'
}
});
const costOnlyContent = costOnlyResp.result?.content?.[0]?.text;
let costOnly = 0;
if (costOnlyContent) {
const match = costOnlyContent.match(/"total_cost":\s*([\d.]+)/);
if (match) {
costOnly = parseFloat(match[1]);
}
console.log(`August 2025 - Cost Only: $${costOnly.toFixed(2)}`);
}
// Test 2: COST + DISCOUNT
console.log('\n💰 TEST 2: COST + DISCOUNT (costType: ["cost", "discount"])');
console.log('===========================================================\n');
const costWithDiscountResp = await this.sendRequest('tools/call', {
name: 'api___invoices_caui',
arguments: {
startDate: '2025-08-01',
endDate: '2025-08-31',
costType: ['cost', 'discount'], // Include both cost and discount
groupBy: 'none',
periodGranLevel: 'month',
isUnblended: true,
cloud_context: 'aws',
customer_account_key: '16185'
}
});
const costWithDiscountContent = costWithDiscountResp.result?.content?.[0]?.text;
let costWithDiscount = 0;
if (costWithDiscountContent) {
const match = costWithDiscountContent.match(/"total_cost":\s*([\d.]+)/);
if (match) {
costWithDiscount = parseFloat(match[1]);
}
console.log(`August 2025 - Cost with Discount: $${costWithDiscount.toFixed(2)}`);
}
// Test 3: DISCOUNT ONLY (to see if there are any discounts)
console.log('\n💰 TEST 3: DISCOUNT ONLY (costType: ["discount"])');
console.log('================================================\n');
const discountOnlyResp = await this.sendRequest('tools/call', {
name: 'api___invoices_caui',
arguments: {
startDate: '2025-08-01',
endDate: '2025-08-31',
costType: ['discount'], // Only discount
groupBy: 'none',
periodGranLevel: 'month',
isUnblended: true,
cloud_context: 'aws',
customer_account_key: '16185'
}
});
const discountOnlyContent = discountOnlyResp.result?.content?.[0]?.text;
let discountOnly = 0;
if (discountOnlyContent) {
const match = discountOnlyContent.match(/"total_cost":\s*([\d.-]+)/);
if (match) {
discountOnly = parseFloat(match[1]);
}
console.log(`August 2025 - Discount Amount: $${discountOnly.toFixed(2)}`);
}
// Summary
console.log('\n📊 DISCOUNT ANALYSIS FOR AUGUST 2025:');
console.log('======================================');
console.log(`Cost Only: $${costOnly.toFixed(2)}`);
console.log(`Cost with Discount: $${costWithDiscount.toFixed(2)}`);
console.log(`Discount Amount: $${discountOnly.toFixed(2)}`);
const difference = costOnly - costWithDiscount;
if (Math.abs(difference) > 0.01) {
console.log(`\n💡 Discounts Applied: $${Math.abs(difference).toFixed(2)}`);
const discountPercent = (Math.abs(difference) / costOnly * 100).toFixed(2);
console.log(` Discount Rate: ${discountPercent}%`);
} else {
console.log('\n❌ No discounts detected');
}
// Now get the full monthly breakdown with discounts included
console.log('\n\n💰 FULL MONTHLY BREAKDOWN (JAN-AUG 2025) WITH DISCOUNTS:');
console.log('========================================================\n');
const fullResp = await this.sendRequest('tools/call', {
name: 'api___invoices_caui',
arguments: {
startDate: '2025-01-01',
endDate: '2025-08-31',
costType: ['cost', 'discount'], // Include discounts
groupBy: 'none',
periodGranLevel: 'month',
isUnblended: true,
cloud_context: 'aws',
customer_account_key: '16185'
}
});
const fullContent = fullResp.result?.content?.[0]?.text;
if (fullContent) {
// Extract the JSON data
const jsonMatch = fullContent.match(/```json\n([\s\S]*?)\n```/);
if (jsonMatch) {
const data = JSON.parse(jsonMatch[1]);
console.log('Month | Total Cost (with discounts)');
console.log('------------|---------------------------');
data.forEach(item => {
const month = item.usage_date;
const cost = item.total_cost.toFixed(2);
console.log(`${month} | $${cost}`);
});
const total = data.reduce((sum, item) => sum + item.total_cost, 0);
console.log('------------|---------------------------');
console.log(`TOTAL | $${total.toFixed(2)}`);
}
}
} catch (error) {
console.error('❌ Error:', error.message);
}
}
async cleanup() {
if (this.server) {
this.server.kill();
}
}
async run() {
try {
await this.start();
await this.getCostData();
} finally {
await this.cleanup();
console.log('\n🏁 Bank Hapoalim Discount Analysis Complete');
}
}
}
const costQuery = new BankHapoalimDiscounts();
costQuery.run();