Untitled
unknown
javascript
8 months ago
5.8 kB
6
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