BLUE
PHP 7.4.33
Path:
/var/www/web-koncept/server/src/controllers
Run
Logout
Edit File
Size: 7.24 KB
Close
/var/www/web-koncept/server/src/controllers/apiController.js
Text
Base64
import leadModel from "../models/leadModel.js"; import salesModel from "../models/salesModel.js"; import Log from "../utils/logger.js"; import { convertTimezone } from "../utils/common.js"; const getFilters = async (req, res, next) => { try { const leads = await leadModel.find(); // Fetch all leads without date filtering const filterData = await extractFilterData(); res.status(200).json({ status: 200, filterData, message: "Filter data fetched successfully", }); } catch (error) { console.error("Error fetching filter data:", error); res.status(500).json({ status: 500, message: "Failed to fetch filter data.", }); } }; const getDashboard = async (req, res, next) => { try { const { start, end, time_zone } = req.body; const startDate = new Date(start); const endDate = new Date(end); if (isNaN(startDate) || isNaN(endDate)) { return res.status(400).json({ status: 400, message: "Invalid date format provided.", }); } // Subtract 1 day from the start date startDate.setDate(startDate.getDate() - 1); // Adjust start date to be at the beginning of the day (00:00:00) // startDate.setUTCHours(0, 0, 0, 0); // Adjust end date to be at the end of the day (23:59:00) endDate.setUTCHours(23, 59, 0, 0); const formattedStartDate = startDate.toISOString(); const formattedEndDate = endDate.toISOString(); // Aggregation to join leads with sales representatives const leads = await leadModel.aggregate([ { $match: { "time_period.start_date": { $gte: formattedStartDate, $lte: formattedEndDate, }, }, }, { $lookup: { from: "sales", // Assuming the sales collection name is 'sales' localField: "sales_rep_id", foreignField: "item_id", as: "sales_rep_details", }, }, ]); // Prepare dashboard data const dashboardData = leads.map((lead, index) => { const { start_date, end_date } = lead.time_period; const formattedStartTime = convertTimezone(time_zone, start_date); const formattedEndTime = convertTimezone(time_zone, end_date); // TODO // if (lead.item_id == 2932787361) // Log.log(JSON.stringify(lead.sales_rep_details)); // get all departments const departments = lead.sales_rep_details.map((rep) => rep.departments); return { id: index + 1, item_id: lead.item_id, text: lead.meeting_address ? formatAddress(lead.meeting_address) : lead.company_name, title: lead.company_name, start_date: formattedStartTime, end_date: formattedEndTime, address: lead.meeting_address, company_name: lead.company_name, sales_rep_id: lead.sales_rep_id, status: lead.status, booker_image: lead.mode_booker, department: [...new Set(departments)], sales_rep_details: lead.sales_rep_details.map((rep) => ({ sales_representative_name: rep.sales_representative_name, departments: rep.departments, color: rep.color, email: rep.email, item_id: rep.item_id, shown_in_calendar_status: rep.shown_in_calendar_status, employment: rep.employment, image: rep.profile_image_url, })), }; }); res.status(200).json({ status: 200, data: dashboardData, message: "Dashboard data fetched successfully.", }); } catch (error) { Log.error("Error fetching dashboard data:", error); res.status(500).json({ status: 500, message: "Failed to fetch dashboard data.", }); } }; const extractFilterData = async () => { const filterData = { departments: [], salesRep: [], }; // Batch fetch sales representatives const salesReps = await salesModel .find({ shown_in_calendar_status: "Active", employment: "Current employee", }) .sort({ sales_representative_name: 1 }); // Track seen departments to avoid duplicates const seenDepartments = new Set(); const seenSalesReps = new Set(); // Process sales representatives to populate filterData for (const salesRep of salesReps) { // Add department if not seen if (salesRep.departments && !seenDepartments.has(salesRep.departments)) { seenDepartments.add(salesRep.departments); filterData.departments.push({ value: filterData.departments.length + 1, // Unique value for each department label: salesRep.departments, }); } // Add sales representative if not seen if ( salesRep.item_id && salesRep.sales_representative_name && !seenSalesReps.has(salesRep.item_id) ) { seenSalesReps.add(salesRep.item_id); filterData.salesRep.push({ item_id: salesRep.item_id, label: salesRep.sales_representative_name, departments: salesRep.departments, image: salesRep.profile_image_url || null, }); } } return filterData; }; // const getSingleEvent = async (req, res, next) => { // try { // const { item_id } = req.params; // const lead = await leadModel.findOne({ item_id: item_id }); // if (!lead) { // return res.status(404).json({ message: "Event not found" }); // } // const salesRep = await salesModel.findOne({ item_id: lead.sales_rep_id }); // const startDateTime = moment.tz( // `${lead.time_period.start_date} ${lead.time_period.start_time}`, // "YYYY-MM-DD HH:mm:ss", // "Asia/Kolkata" // ); // const endDateTime = moment.tz( // `${lead.time_period.start_date} ${lead.time_period.end_time}`, // "YYYY-MM-DD HH:mm:ss", // "Asia/Kolkata" // ); // const formattedStartTime = startDateTime.format("hh:mm A"); // const formattedStartDate = startDateTime.format("DD MMMM YYYY"); // const timePeriod = `${formattedStartTime} - ${formattedStartDate}`; // const duration = moment.duration(endDateTime.diff(startDateTime)).asHours(); // const event = { // item_id: lead.item_id, // sales_representative_name: salesRep?.sales_representative_name || "Unknown", // department: salesRep?.departments || "Unknown", // address: lead.meeting_address, // time_period: timePeriod, // duration: `${duration} hours`, // company_client: lead.company_name, // }; // res.status(200).json({ // status: 200, // event, // }); // } catch (error) { // console.error("Error fetching event:", error); // res.status(500).json({ // status: 500, // message: "Failed to fetch event.", // }); // } // }; export default { getDashboard, getFilters, }; function formatAddress(address) { // Extract values with fallbacks to empty strings if they're not present const { postal_code = "", city = "", value = "" } = address; // Split the 'value' field to separate street, city, etc., in case it includes additional data const [street] = value.split(",").map((part) => part.trim()); // Assemble the formatted address parts in the order: postal code, city, street const formattedParts = [postal_code, city, street].filter((part) => part); // Join parts with ", " only for non-empty values return formattedParts.join(", "); }
Save
Close
Exit & Reset
Text mode: syntax highlighting auto-detects file type.
Directory Contents
Dirs: 0 × Files: 6
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
apiController.js
7.24 KB
lrw-r--r--
2024-11-06 12:06:11
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
authController.js
3.40 KB
lrw-r--r--
2024-11-06 12:06:11
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
cronSyncController.js
2.53 KB
lrw-r--r--
2024-11-05 04:29:08
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hookController.js
8.74 KB
lrw-r--r--
2024-11-05 04:29:08
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
initialSynController.js
1.01 KB
lrw-r--r--
2024-11-04 12:03:48
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
testController.js
7.53 KB
lrw-r--r--
2024-11-04 12:03:48
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).