Files
bussines_case_automation/index.js
andrei ee0bb76f22 Fix minimarket form data handling and Excel template integration
- Ensured minimarket_store_type section is properly generated in config.json
- Form now correctly saves and processes minimarket data when selected
- Excel template integration working for all store types including minimarket

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 11:55:00 +00:00

198 lines
9.7 KiB
JavaScript

const fs = require('fs');
const path = require('path');
// Function to update config.json with form data
async function updateConfig(formData) {
return new Promise((resolve, reject) => {
const configPath = path.join(__dirname, 'config.json');
// Read the existing config file
fs.readFile(configPath, 'utf8', (err, data) => {
if (err) {
reject(new Error(`Failed to read config file: ${err.message}`));
return;
}
try {
// Parse the existing config
const configData = JSON.parse(data);
// Update user_data in the config with form data
configData.user_data = {
// Contact information
first_name: formData.firstName || "",
last_name: formData.lastName || "",
company_name: formData.company || "",
email: formData.email || "",
phone: formData.phone || "",
store_name: formData.storeName || "",
country: formData.country || "",
starting_date: formData.startingDate || "",
duration: parseInt(formData.duration) || 36,
// Store information
store_types: getSelectedStoreTypes(formData),
open_days_per_month: parseInt(formData.openDays) || 0,
// Store type specific data
convenience_store_type: {
stores_number: isStoreTypeSelected(formData, 'Convenience') ? parseInt(formData.convenience_stores) || 0 : 0,
monthly_transactions: isStoreTypeSelected(formData, 'Convenience') ? parseInt(formData.convenience_transactions) || 0 : 0,
has_digital_screens: isStoreTypeSelected(formData, 'Convenience') ? formData.convenience_screens === "Yes" : false,
screen_count: isStoreTypeSelected(formData, 'Convenience') ? parseInt(formData.convenience_screen_count) || 0 : 0,
screen_percentage: isStoreTypeSelected(formData, 'Convenience') ? parseInt(formData.convenience_screen_percentage) || 0 : 0,
has_in_store_radio: isStoreTypeSelected(formData, 'Convenience') ? formData.convenience_radio === "Yes" : false,
radio_percentage: isStoreTypeSelected(formData, 'Convenience') ? parseInt(formData.convenience_radio_percentage) || 0 : 0,
open_days_per_month: parseInt(formData.openDays) || 0
},
minimarket_store_type: {
stores_number: isStoreTypeSelected(formData, 'Minimarket') ? parseInt(formData.minimarket_stores) || 0 : 0,
monthly_transactions: isStoreTypeSelected(formData, 'Minimarket') ? parseInt(formData.minimarket_transactions) || 0 : 0,
has_digital_screens: isStoreTypeSelected(formData, 'Minimarket') ? formData.minimarket_screens === "Yes" : false,
screen_count: isStoreTypeSelected(formData, 'Minimarket') ? parseInt(formData.minimarket_screen_count) || 0 : 0,
screen_percentage: isStoreTypeSelected(formData, 'Minimarket') ? parseInt(formData.minimarket_screen_percentage) || 0 : 0,
has_in_store_radio: isStoreTypeSelected(formData, 'Minimarket') ? formData.minimarket_radio === "Yes" : false,
radio_percentage: isStoreTypeSelected(formData, 'Minimarket') ? parseInt(formData.minimarket_radio_percentage) || 0 : 0,
open_days_per_month: parseInt(formData.openDays) || 0
},
supermarket_store_type: {
stores_number: isStoreTypeSelected(formData, 'Supermarket') ? parseInt(formData.supermarket_stores) || 0 : 0,
monthly_transactions: isStoreTypeSelected(formData, 'Supermarket') ? parseInt(formData.supermarket_transactions) || 0 : 0,
has_digital_screens: isStoreTypeSelected(formData, 'Supermarket') ? formData.supermarket_screens === "Yes" : false,
screen_count: isStoreTypeSelected(formData, 'Supermarket') ? parseInt(formData.supermarket_screen_count) || 0 : 0,
screen_percentage: isStoreTypeSelected(formData, 'Supermarket') ? parseInt(formData.supermarket_screen_percentage) || 0 : 0,
has_in_store_radio: isStoreTypeSelected(formData, 'Supermarket') ? formData.supermarket_radio === "Yes" : false,
radio_percentage: isStoreTypeSelected(formData, 'Supermarket') ? parseInt(formData.supermarket_radio_percentage) || 0 : 0,
open_days_per_month: parseInt(formData.openDays) || 0
},
hypermarket_store_type: {
stores_number: isStoreTypeSelected(formData, 'Hypermarket') ? parseInt(formData.hypermarket_stores) || 0 : 0,
monthly_transactions: isStoreTypeSelected(formData, 'Hypermarket') ? parseInt(formData.hypermarket_transactions) || 0 : 0,
has_digital_screens: isStoreTypeSelected(formData, 'Hypermarket') ? formData.hypermarket_screens === "Yes" : false,
screen_count: isStoreTypeSelected(formData, 'Hypermarket') ? parseInt(formData.hypermarket_screen_count) || 0 : 0,
screen_percentage: isStoreTypeSelected(formData, 'Hypermarket') ? parseInt(formData.hypermarket_screen_percentage) || 0 : 0,
has_in_store_radio: isStoreTypeSelected(formData, 'Hypermarket') ? formData.hypermarket_radio === "Yes" : false,
radio_percentage: isStoreTypeSelected(formData, 'Hypermarket') ? parseInt(formData.hypermarket_radio_percentage) || 0 : 0,
open_days_per_month: parseInt(formData.openDays) || 0
},
// On-site channels
on_site_channels: getSelectedChannels(formData, 'onSiteChannels'),
website_visitors: isChannelSelected(formData, 'onSiteChannels', 'Website') ? parseInt(formData.websiteVisitors) || 0 : 0,
app_users: isChannelSelected(formData, 'onSiteChannels', 'Mobile App') ? parseInt(formData.appUsers) || 0 : 0,
loyalty_users: isChannelSelected(formData, 'onSiteChannels', 'Loyalty Program') ? parseInt(formData.loyaltyUsers) || 0 : 0,
// Off-site channels
off_site_channels: getSelectedChannels(formData, 'offSiteChannels'),
facebook_followers: isChannelSelected(formData, 'offSiteChannels', 'Facebook Business') ? parseInt(formData.facebookFollowers) || 0 : 0,
instagram_followers: isChannelSelected(formData, 'offSiteChannels', 'Instagram Business') ? parseInt(formData.instagramFollowers) || 0 : 0,
google_views: isChannelSelected(formData, 'offSiteChannels', 'Google Business Profile') ? parseInt(formData.googleViews) || 0 : 0,
email_subscribers: isChannelSelected(formData, 'offSiteChannels', 'Email') ? parseInt(formData.emailSubscribers) || 0 : 0,
sms_users: isChannelSelected(formData, 'offSiteChannels', 'SMS') ? parseInt(formData.smsUsers) || 0 : 0,
whatsapp_contacts: isChannelSelected(formData, 'offSiteChannels', 'WhatsApp') ? parseInt(formData.whatsappContacts) || 0 : 0,
// Preserve existing calculation results if they exist
potential_reach_in_store: 0,
unique_impressions_in_store: 0,
potential_reach_on_site: 0,
unique_impressions_on_site: 0,
potential_reach_off_site: 0,
unique_impressions_off_site: 0
};
// Write the updated config back to the file
const updatedConfig = JSON.stringify(configData, null, 2);
fs.writeFile(configPath, updatedConfig, 'utf8', (writeErr) => {
if (writeErr) {
reject(new Error(`Failed to write to config file: ${writeErr.message}`));
return;
}
resolve();
});
} catch (parseError) {
reject(new Error(`Failed to parse config file: ${parseError.message}`));
}
});
});
}
// Helper function to check if a channel is selected
function isChannelSelected(formData, channelType, channelName) {
const selectedChannels = getSelectedChannels(formData, channelType);
return selectedChannels.includes(channelName);
}
// Helper function to get selected channels from form data
function getSelectedChannels(formData, channelType) {
console.log(`Getting selected channels for ${channelType} from formData:`, formData[channelType]);
let channels = [];
if (formData[channelType]) {
if (Array.isArray(formData[channelType])) {
channels = formData[channelType];
} else {
channels = [formData[channelType]];
}
}
console.log(`Selected ${channelType}:`, channels);
return channels;
}
// Helper function to check if a store type is selected
function isStoreTypeSelected(formData, storeType) {
const selectedTypes = getSelectedStoreTypes(formData);
return selectedTypes.includes(storeType);
}
// Helper function to get selected store types from form data
function getSelectedStoreTypes(formData) {
console.log('Getting selected store types from formData:', formData);
// Check if storeTypes is an array or single value
let storeTypes = [];
if (formData.storeTypes) {
if (Array.isArray(formData.storeTypes)) {
storeTypes = formData.storeTypes;
} else {
storeTypes = [formData.storeTypes];
}
}
console.log('Selected store types:', storeTypes);
return storeTypes;
}
// Function to fetch config.json
async function fetchConfig() {
return new Promise((resolve, reject) => {
fs.readFile(path.join(__dirname, 'config.json'), 'utf8', (err, data) => {
if (err) {
reject(new Error(`Failed to read config file: ${err.message}`));
return;
}
try {
const config = JSON.parse(data);
resolve(config);
} catch (parseError) {
reject(new Error(`Failed to parse config file: ${parseError.message}`));
}
});
});
}
// For Node.js environment, export the functions
if (typeof module !== 'undefined' && module.exports) {
module.exports = {
updateConfig,
fetchConfig
};
}