Untitled
unknown
javascript
5 days ago
5.8 kB
5
Indexable
router.post("/daily_report", permissionCheck("ADMIN_RAPOR"), async (req, res) => { try { let { start_date, end_date } = req.body; // Default dates if not provided: 2 months ago to today if (!start_date) { start_date = moment().subtract(1, 'months').startOf('day').toDate(); } if (!end_date) { end_date = moment().endOf('day').toDate(); } // Get all earnings grouped by day and type const earnings = await AdminSalaryModel.aggregate([ { $match: { dayDate: { $gte: new Date(start_date), $lte: new Date(end_date) } } }, { $group: { _id: { date: { $dateToString: { format: "%Y-%m-%d", date: "$dayDate" } }, type: "$Type" }, total: { $sum: "$Salary" } } } ]); // Get all payouts grouped by day const payouts = await AdminFinanceModel.aggregate([ { $match: { Status: "success", verifyDate: { $gte: new Date(start_date), $lte: new Date(end_date) } } }, { $group: { _id: { date: { $dateToString: { format: "%Y-%m-%d", date: "$verifyDate" } } }, total: { $sum: "$AmountTL" } } } ]); // Get revenue grouped by day and platform const revenue = await PurchaseModel.aggregate([ { $match: { purchasedAt: { $gte: new Date(start_date), $lte: new Date(end_date) } } }, { $group: { _id: { date: { $dateToString: { format: "%Y-%m-%d", date: "$purchasedAt" } }, platform: { $switch: { branches: [ { case: { $eq: ["$store", "PLAY_STORE"] }, then: "android" }, { case: { $eq: ["$store", "APP_STORE"] }, then: "ios" } ], default: "other" } } }, total: { $sum: "$price" } } } ]); // Combine all data const dailyStats = new Map(); // Process earnings earnings.forEach(earning => { const date = earning._id.date; if (!dailyStats.has(date)) { dailyStats.set(date, { date, adminHour: 0, adminPrim: 0, adminTotal: 0, adminPayouts: 0, revenue: 0, revenueAndroid: 0, revenueIos: 0 }); } const dayData = dailyStats.get(date); if (earning._id.type === 'hour') { dayData.adminHour = earning.total; } else if (earning._id.type === 'prim') { dayData.adminPrim = earning.total; } dayData.adminTotal = dayData.adminHour + dayData.adminPrim; }); // Process payouts payouts.forEach(payout => { const date = payout._id.date; if (dailyStats.has(date)) { dailyStats.get(date).adminPayouts = payout.total; } else { dailyStats.set(date, { date, adminHour: 0, adminPrim: 0, adminTotal: 0, adminPayouts: payout.total, revenue: 0, revenueAndroid: 0, revenueIos: 0 }); } }); // Process revenue revenue.forEach(rev => { const date = rev._id.date; if (!dailyStats.has(date)) { dailyStats.set(date, { date, adminHour: 0, adminPrim: 0, adminTotal: 0, adminPayouts: 0, revenue: 0, revenueAndroid: 0, revenueIos: 0 }); } const dayData = dailyStats.get(date); if (rev._id.platform === 'android') { dayData.revenueAndroid = rev.total; } else if (rev._id.platform === 'ios') { dayData.revenueIos = rev.total; } dayData.revenue = dayData.revenueAndroid + dayData.revenueIos; }); const dailyData = Array.from(dailyStats.values()); dailyData.sort((a, b) => b.date.localeCompare(a.date)); // Sort by date descending res.send({ status: true, data: dailyData, date_range: { start_date: moment(start_date).format('YYYY-MM-DD'), end_date: moment(end_date).format('YYYY-MM-DD') } }); } catch (e) { console.log("Daily salary error:", e); res.send({ status: false, msg: e.toString() }); } });
Editor is loading...
Leave a Comment